1 /*!
2  * jQuery JavaScript Library v1.
3.2
3  * http://jquery.com/
4  *
5  * Copyright (c)
2009 John Resig
6  * Dual licensed under the MIT and GPL licenses.
7  * http://docs.jquery.com/License
8  *
9  * Date:
2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
10  * Revision:
6246
11  */
12 (function(){

13
14 var

15     // Will speed up references to window, and allows munging its name.
16     window =
this,
17     // Will speed up references to undefined, and allows munging its name.
18     undefined,
19     // Map over jQuery
in case of overwrite
20     _jQuery = window.jQuery,
21     // Map over the $
in case of overwrite
22     _$ = window.$,
23
24     jQuery = window.jQuery = window.$ = function( selector, context ) {
25         // The jQuery
object is actually just the init constructor 'enhanced'
26         
return new jQuery.fn.init( selector, context );
27     },
28
29     // A simple way to check
for HTML strings or ID strings
30     // (both of which we optimize
for)
31     quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
32     // Is it a simple selector
33     isSimple = /^.[^:#\[\.,]*$/;
34
35 jQuery.fn = jQuery.prototype = {
36     init: function( selector, context ) {
37         // Make sure that a selection was provided
38         selector = selector || document;
39
40         // Handle $(DOMElement)
41         
if ( selector.nodeType ) {
42             
this[0] = selector;
43             
this.length = 1;
44             
this.context = selector;
45             
return this;
46         }
47         // Handle HTML strings
48         
if ( typeof selector === "string" ) {
49             // Are we dealing with HTML
string or an ID?
50             
var match = quickExpr.exec( selector );
51
52             // Verify a match, and that no context was specified
for #id
53             
if ( match && (match[1] || !context) ) {
54
55                 // HANDLE: $(html) -> $(array)
56                 
if ( match[1] )
57                     selector = jQuery.clean( [ match[
1] ], context );
58
59                 // HANDLE: $(
"#id")
60                 
else {
61                     
var elem = document.getElementById( match[3] );
62
63                     // Handle the
case where IE and Opera return items
64                     //
by name instead of ID
65                     
if ( elem && elem.id != match[3] )
66                         
return jQuery().find( selector );
67
68                     // Otherwise, we inject the element directly
into the jQuery object
69                     
var ret = jQuery( elem || [] );
70                     ret.context = document;
71                     ret.selector = selector;
72                     
return ret;
73                 }
74
75             // HANDLE: $(expr, [context])
76             // (which
is just equivalent to: $(content).find(expr)
77             }
else
78                 
return jQuery( context ).find( selector );
79
80         // HANDLE: $(function)
81         // Shortcut
for document ready
82         }
else if ( jQuery.isFunction( selector ) )
83             
return jQuery( document ).ready( selector );
84
85         // Make sure that old selector state
is passed along
86         
if ( selector.selector && selector.context ) {
87             
this.selector = selector.selector;
88             
this.context = selector.context;
89         }
90
91         
return this.setArray(jQuery.isArray( selector ) ?
92             selector :
93             jQuery.makeArray(selector));
94     },
95
96     // Start with an empty selector
97     selector:
"",
98
99     // The current version of jQuery being used
100     jquery:
"1.3.2",
101
102     // The number of elements contained
in the matched element set
103     size: function() {
104         
return this.length;
105     },
106
107     // Get the Nth element
in the matched element set OR
108     // Get the whole matched element
set as a clean array
109     
get: function( num ) {
110         
return num === undefined ?
111
112             // Return a
'clean' array
113             Array.prototype.slice.call(
this ) :
114
115             // Return just the
object
116             
this[ num ];
117     },
118
119     // Take an array of elements and push it onto the stack
120     // (returning the
new matched element set)
121     pushStack: function( elems, name, selector ) {
122         // Build a
new jQuery matched element set
123         
var ret = jQuery( elems );
124
125         // Add the old
object onto the stack (as a reference)
126         ret.prevObject =
this;
127
128         ret.context =
this.context;
129
130         
if ( name === "find" )
131             ret.selector =
this.selector + (this.selector ? " " : "") + selector;
132         
else if ( name )
133             ret.selector =
this.selector + "." + name + "(" + selector + ")";
134
135         // Return the newly-formed element
set
136         
return ret;
137     },
138
139     // Force the current matched
set of elements to become
140     // the specified array of elements (destroying the stack
in the process)
141     // You should use pushStack()
in order to do this, but maintain the stack
142     setArray: function( elems ) {
143         // Resetting the length to
0, then using the native Array push
144         //
is a super-fast way to populate an object with array-like properties
145         
this.length = 0;
146         Array.prototype.push.apply(
this, elems );
147
148         
return this;
149     },
150
151     // Execute a callback
for every element in the matched set.
152     // (You can seed the arguments with an array of args, but
this is
153     // only used internally.)
154     each: function( callback, args ) {
155         
return jQuery.each( this, callback, args );
156     },
157
158     // Determine the position of an element within
159     // the matched
set of elements
160     index: function( elem ) {
161         // Locate the position of the desired element
162         
return jQuery.inArray(
163             // If it receives a jQuery
object, the first element is used
164             elem && elem.jquery ? elem[
0] : elem
165         ,
this );
166     },
167
168     attr: function( name,
value, type ) {
169         
var options = name;
170
171         // Look
for the case where we're accessing a style value
172         
if ( typeof name === "string" )
173             
if ( value === undefined )
174                 
return this[0] && jQuery[ type || "attr" ]( this[0], name );
175
176             
else {
177                 options = {};
178                 options[ name ] =
value;
179             }
180
181         // Check to see
if we're setting style values
182         
return this.each(function(i){
183             // Set all the styles
184             
for ( name in options )
185                 jQuery.attr(
186                     type ?
187                         
this.style :
188                         
this,
189                     name, jQuery.prop(
this, options[ name ], type, i, name )
190                 );
191         });
192     },
193
194     css: function( key,
value ) {
195         // ignore negative width and height values
196         
if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
197             
value = undefined;
198         
return this.attr( key, value, "curCSS" );
199     },
200
201     text: function( text ) {
202         
if ( typeof text !== "object" && text != null )
203             
return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
204
205         
var ret = "";
206
207         jQuery.each( text ||
this, function(){
208             jQuery.each(
this.childNodes, function(){
209                 
if ( this.nodeType != 8 )
210                     ret +=
this.nodeType != 1 ?
211                         
this.nodeValue :
212                         jQuery.fn.text( [
this ] );
213             });
214         });
215
216         
return ret;
217     },
218
219     wrapAll: function( html ) {
220         
if ( this[0] ) {
221             // The elements to wrap the target around
222             
var wrap = jQuery( html, this[0].ownerDocument ).clone();
223
224             
if ( this[0].parentNode )
225                 wrap.insertBefore(
this[0] );
226
227             wrap.map(function(){
228                 
var elem = this;
229
230                 
while ( elem.firstChild )
231                     elem = elem.firstChild;
232
233                 
return elem;
234             }).append(
this);
235         }
236
237         
return this;
238     },
239
240     wrapInner: function( html ) {
241         
return this.each(function(){
242             jQuery(
this ).contents().wrapAll( html );
243         });
244     },
245
246     wrap: function( html ) {
247         
return this.each(function(){
248             jQuery(
this ).wrapAll( html );
249         });
250     },
251
252     append: function() {
253         
return this.domManip(arguments, true, function(elem){
254             
if (this.nodeType == 1)
255                 
this.appendChild( elem );
256         });
257     },
258
259     prepend: function() {
260         
return this.domManip(arguments, true, function(elem){
261             
if (this.nodeType == 1)
262                 
this.insertBefore( elem, this.firstChild );
263         });
264     },
265
266     before: function() {
267         
return this.domManip(arguments, false, function(elem){
268             
this.parentNode.insertBefore( elem, this );
269         });
270     },
271
272     after: function() {
273         
return this.domManip(arguments, false, function(elem){
274             
this.parentNode.insertBefore( elem, this.nextSibling );
275         });
276     },
277
278     end: function() {
279         
return this.prevObject || jQuery( [] );
280     },
281
282     // For
internal use only.
283     // Behaves like an Array
's method, not like a jQuery method.
284     push: [].push,
285     sort: [].sort,
286     splice: [].splice,
287
288     find: function( selector ) {
289         
if ( this.length === 1 ) {
290             
var ret = this.pushStack( [], "find", selector );
291             ret.length =
0;
292             jQuery.find( selector,
this[0], ret );
293             
return ret;
294         }
else {
295             
return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
296                 
return jQuery.find( selector, elem );
297             })),
"find", selector );
298         }
299     },
300
301     clone: function( events ) {
302         // Do the clone
303         
var ret = this.map(function(){
304             
if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
305                 // IE copies events bound via attachEvent
when
306                 //
using cloneNode. Calling detachEvent on the
307                 // clone will also
remove the events from the orignal
308                 // In order to
get around this, we use innerHTML.
309                 // Unfortunately,
this means some modifications to
310                 // attributes
in IE that are actually only stored
311                 //
as properties will not be copied (such as the
312                 // the name attribute
on an input).
313                 
var html = this.outerHTML;
314                 
if ( !html ) {
315                     
var div = this.ownerDocument.createElement("div");
316                     div.appendChild(
this.cloneNode(true) );
317                     html = div.innerHTML;
318                 }
319
320                 
return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
321             }
else
322                 
return this.cloneNode(true);
323         });
324
325         // Copy the events
from the original to the clone
326         
if ( events === true ) {
327             
var orig = this.find("*").andSelf(), i = 0;
328
329             ret.find(
"*").andSelf().each(function(){
330                 
if ( this.nodeName !== orig[i].nodeName )
331                     
return;
332
333                 
var events = jQuery.data( orig[i], "events" );
334
335                 
for ( var type in events ) {
336                     
for ( var handler in events[ type ] ) {
337                         jQuery.
event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
338                     }
339                 }
340
341                 i++;
342             });
343         }
344
345         // Return the cloned
set
346         
return ret;
347     },
348
349     filter: function( selector ) {
350         
return this.pushStack(
351             jQuery.isFunction( selector ) &&
352             jQuery.grep(
this, function(elem, i){
353                 
return selector.call( elem, i );
354             }) ||
355
356             jQuery.multiFilter( selector, jQuery.grep(
this, function(elem){
357                 
return elem.nodeType === 1;
358             }) ),
"filter", selector );
359     },
360
361     closest: function( selector ) {
362         
var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
363             closer =
0;
364
365         
return this.map(function(){
366             
var cur = this;
367             
while ( cur && cur.ownerDocument ) {
368                 
if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
369                     jQuery.data(cur,
"closest", closer);
370                     
return cur;
371                 }
372                 cur = cur.parentNode;
373                 closer++;
374             }
375         });
376     },
377
378     not: function( selector ) {
379         
if ( typeof selector === "string" )
380             // test special
case where just one selector is passed in
381             
if ( isSimple.test( selector ) )
382                 
return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
383             
else
384                 selector = jQuery.multiFilter( selector,
this );
385
386         
var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
387         
return this.filter(function() {
388             
return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
389         });
390     },
391
392     
add: function( selector ) {
393         
return this.pushStack( jQuery.unique( jQuery.merge(
394             
this.get(),
395             
typeof selector === "string" ?
396                 jQuery( selector ) :
397                 jQuery.makeArray( selector )
398         )));
399     },
400
401     
is: function( selector ) {
402         
return !!selector && jQuery.multiFilter( selector, this ).length > 0;
403     },
404
405     hasClass: function( selector ) {
406         
return !!selector && this.is( "." + selector );
407     },
408
409     val: function(
value ) {
410         
if ( value === undefined ) {
411             
var elem = this[0];
412
413             
if ( elem ) {
414                 
if( jQuery.nodeName( elem, 'option' ) )
415                     
return (elem.attributes.value || {}).specified ? elem.value : elem.text;
416                 
417                 // We need to handle
select boxes special
418                 
if ( jQuery.nodeName( elem, "select" ) ) {
419                     
var index = elem.selectedIndex,
420                         values = [],
421                         options = elem.options,
422                         one = elem.type ==
"select-one";
423
424                     // Nothing was selected
425                     
if ( index < 0 )
426                         
return null;
427
428                     // Loop through all the selected options
429                     
for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
430                         
var option = options[ i ];
431
432                         
if ( option.selected ) {
433                             // Get the specifc
value for the option
434                             
value = jQuery(option).val();
435
436                             // We don
't need an array for one selects
437                             
if ( one )
438                                 
return value;
439
440                             // Multi-Selects
return an array
441                             values.push(
value );
442                         }
443                     }
444
445                     
return values;
446                 }
447
448                 // Everything
else, we just grab the value
449                 
return (elem.value || "").replace(/\r/g, "");
450
451             }
452
453             
return undefined;
454         }
455
456         
if ( typeof value === "number" )
457             
value += '';
458
459         
return this.each(function(){
460             
if ( this.nodeType != 1 )
461                 
return;
462
463             
if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
464                 
this.checked = (jQuery.inArray(this.value, value) >= 0 ||
465                     jQuery.inArray(
this.name, value) >= 0);
466
467             
else if ( jQuery.nodeName( this, "select" ) ) {
468                 
var values = jQuery.makeArray(value);
469
470                 jQuery(
"option", this ).each(function(){
471                     
this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
472                         jQuery.inArray(
this.text, values ) >= 0);
473                 });
474
475                 
if ( !values.length )
476                     
this.selectedIndex = -1;
477
478             }
else
479                 
this.value = value;
480         });
481     },
482
483     html: function(
value ) {
484         
return value === undefined ?
485             (
this[0] ?
486                 
this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
487                 
null) :
488             
this.empty().append( value );
489     },
490
491     replaceWith: function(
value ) {
492         
return this.after( value ).remove();
493     },
494
495     eq: function( i ) {
496         
return this.slice( i, +i + 1 );
497     },
498
499     slice: function() {
500         
return this.pushStack( Array.prototype.slice.apply( this, arguments ),
501             
"slice", Array.prototype.slice.call(arguments).join(",") );
502     },
503
504     map: function( callback ) {
505         
return this.pushStack( jQuery.map(this, function(elem, i){
506             
return callback.call( elem, i, elem );
507         }));
508     },
509
510     andSelf: function() {
511         
return this.add( this.prevObject );
512     },
513
514     domManip: function( args, table, callback ) {
515         
if ( this[0] ) {
516             
var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
517                 scripts = jQuery.clean( args, (
this[0].ownerDocument || this[0]), fragment ),
518                 first = fragment.firstChild;
519
520             
if ( first )
521                 
for ( var i = 0, l = this.length; i < l; i++ )
522                     callback.call( root(
this[i], first), this.length > 1 || i > 0 ?
523                             fragment.cloneNode(
true) : fragment );
524         
525             
if ( scripts )
526                 jQuery.each( scripts, evalScript );
527         }
528
529         
return this;
530         
531         function root( elem, cur ) {
532             
return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
533                 (elem.getElementsByTagName(
"tbody")[0] ||
534                 elem.appendChild(elem.ownerDocument.createElement(
"tbody"))) :
535                 elem;
536         }
537     }
538 };
539
540 // Give the init function the jQuery prototype
for later instantiation
541 jQuery.fn.init.prototype = jQuery.fn;
542
543 function evalScript( i, elem ) {
544     
if ( elem.src )
545         jQuery.ajax({
546             url: elem.src,
547             
async: false,
548             dataType:
"script"
549         });
550
551     
else
552         jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML ||
"" );
553
554     
if ( elem.parentNode )
555         elem.parentNode.removeChild( elem );
556 }
557
558 function now(){
559     
return +new Date;
560 }
561
562 jQuery.extend = jQuery.fn.extend = function() {
563     // copy reference to target
object
564     
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
565
566     // Handle a deep copy situation
567     
if ( typeof target === "boolean" ) {
568         deep = target;
569         target = arguments[
1] || {};
570         // skip the boolean and the target
571         i =
2;
572     }
573
574     // Handle
case when target is a string or something (possible in deep copy)
575     
if ( typeof target !== "object" && !jQuery.isFunction(target) )
576         target = {};
577
578     // extend jQuery itself
if only one argument is passed
579     
if ( length == i ) {
580         target =
this;
581         --i;
582     }
583
584     
for ( ; i < length; i++ )
585         // Only deal with non-
null/undefined values
586         
if ( (options = arguments[ i ]) != null )
587             // Extend the
base object
588             
for ( var name in options ) {
589                 
var src = target[ name ], copy = options[ name ];
590
591                 // Prevent never-ending loop
592                 
if ( target === copy )
593                     
continue;
594
595                 // Recurse
if we're merging object values
596                 
if ( deep && copy && typeof copy === "object" && !copy.nodeType )
597                     target[ name ] = jQuery.extend( deep,
598                         // Never move original objects, clone them
599                         src || ( copy.length !=
null ? [ ] : { } )
600                     , copy );
601
602                 // Don
't bring in undefined values
603                 
else if ( copy !== undefined )
604                     target[ name ] = copy;
605
606             }
607
608     // Return the modified
object
609     
return target;
610 };
611
612 // exclude the following css properties to
add px
613 var
exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
614     // cache defaultView
615     defaultView = document.defaultView || {},
616     toString = Object.prototype.toString;
617
618 jQuery.extend({
619     noConflict: function( deep ) {
620         window.$ = _$;
621
622         
if ( deep )
623             window.jQuery = _jQuery;
624
625         
return jQuery;
626     },
627
628     // See test/unit/core.js
for details concerning isFunction.
629     // Since version
1.3, DOM methods and functions like alert
630     // aren
't supported. They return false on IE (#2968).
631     isFunction: function( obj ) {
632         
return toString.call(obj) === "[object Function]";
633     },
634
635     isArray: function( obj ) {
636         
return toString.call(obj) === "[object Array]";
637     },
638
639     // check
if an element is in a (or is an) XML document
640     isXMLDoc: function( elem ) {
641         
return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
642             !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
643     },
644
645     // Evalulates a script
in a global context
646     globalEval: function( data ) {
647         
if ( data && /\S/.test(data) ) {
648             // Inspired
by code by Andrea Giammarchi
649             // http://webreflection.blogspot.com/
2007/08/global-scope-evaluation-and-dom.html
650             
var head = document.getElementsByTagName("head")[0] || document.documentElement,
651                 script = document.createElement(
"script");
652
653             script.type =
"text/javascript";
654             
if ( jQuery.support.scriptEval )
655                 script.appendChild( document.createTextNode( data ) );
656             
else
657                 script.text = data;
658
659             // Use insertBefore instead of appendChild to circumvent an IE6 bug.
660             // This arises
when a base node is used (#2709).
661             head.insertBefore( script, head.firstChild );
662             head.removeChild( script );
663         }
664     },
665
666     nodeName: function( elem, name ) {
667         
return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
668     },
669
670     // args
is for internal usage only
671     each: function(
object, callback, args ) {
672         
var name, i = 0, length = object.length;
673
674         
if ( args ) {
675             
if ( length === undefined ) {
676                 
for ( name in object )
677                     
if ( callback.apply( object[ name ], args ) === false )
678                         
break;
679             }
else
680                 
for ( ; i < length; )
681                     
if ( callback.apply( object[ i++ ], args ) === false )
682                         
break;
683
684         // A special, fast,
case for the most common use of each
685         }
else {
686             
if ( length === undefined ) {
687                 
for ( name in object )
688                     
if ( callback.call( object[ name ], name, object[ name ] ) === false )
689                         
break;
690             }
else
691                 
for ( var value = object[0];
692                     i < length && callback.call(
value, i, value ) !== false; value = object[++i] ){}
693         }
694
695         
return object;
696     },
697
698     prop: function( elem,
value, type, i, name ) {
699         // Handle executable functions
700         
if ( jQuery.isFunction( value ) )
701             
value = value.call( elem, i );
702
703         // Handle passing
in a number to a CSS property
704         
return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
705             
value + "px" :
706             
value;
707     },
708
709     className: {
710         //
internal only, use addClass("class")
711         
add: function( elem, classNames ) {
712             jQuery.each((classNames ||
"").split(/\s+/), function(i, className){
713                 
if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
714                     elem.className += (elem.className ?
" " : "") + className;
715             });
716         },
717
718         //
internal only, use removeClass("class")
719         
remove: function( elem, classNames ) {
720             
if (elem.nodeType == 1)
721                 elem.className = classNames !== undefined ?
722                     jQuery.grep(elem.className.split(/\s+/), function(className){
723                         
return !jQuery.className.has( classNames, className );
724                     }).
join(" ") :
725                     
"";
726         },
727
728         //
internal only, use hasClass("class")
729         has: function( elem, className ) {
730             
return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
731         }
732     },
733
734     // A method
for quickly swapping in/out CSS properties to get correct calculations
735     swap: function( elem, options, callback ) {
736         
var old = {};
737         // Remember the old values, and insert the
new ones
738         
for ( var name in options ) {
739             old[ name ] = elem.style[ name ];
740             elem.style[ name ] = options[ name ];
741         }
742
743         callback.call( elem );
744
745         // Revert the old values
746         
for ( var name in options )
747             elem.style[ name ] = old[ name ];
748     },
749
750     css: function( elem, name, force, extra ) {
751         
if ( name == "width" || name == "height" ) {
752             
var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
753
754             function getWH() {
755                 val = name ==
"width" ? elem.offsetWidth : elem.offsetHeight;
756
757                 
if ( extra === "border" )
758                     
return;
759
760                 jQuery.each( which, function() {
761                     
if ( !extra )
762                         val -= parseFloat(jQuery.curCSS( elem,
"padding" + this, true)) || 0;
763                     
if ( extra === "margin" )
764                         val += parseFloat(jQuery.curCSS( elem,
"margin" + this, true)) || 0;
765                     
else
766                         val -= parseFloat(jQuery.curCSS( elem,
"border" + this + "Width", true)) || 0;
767                 });
768             }
769
770             
if ( elem.offsetWidth !== 0 )
771                 getWH();
772             
else
773                 jQuery.swap( elem, props, getWH );
774
775             
return Math.max(0, Math.round(val));
776         }
777
778         
return jQuery.curCSS( elem, name, force );
779     },
780
781     curCSS: function( elem, name, force ) {
782         
var ret, style = elem.style;
783
784         // We need to handle opacity special
in IE
785         
if ( name == "opacity" && !jQuery.support.opacity ) {
786             ret = jQuery.attr( style,
"opacity" );
787
788             
return ret == "" ?
789                 
"1" :
790                 ret;
791         }
792
793         // Make sure we
're using the right name for getting the float value
794         
if ( name.match( /float/i ) )
795             name = styleFloat;
796
797         
if ( !force && style && style[ name ] )
798             ret = style[ name ];
799
800         
else if ( defaultView.getComputedStyle ) {
801
802             // Only
"float" is needed here
803             
if ( name.match( /float/i ) )
804                 name =
"float";
805
806             name = name.replace( /([A-Z])/g,
"-$1" ).toLowerCase();
807
808             
var computedStyle = defaultView.getComputedStyle( elem, null );
809
810             
if ( computedStyle )
811                 ret = computedStyle.getPropertyValue( name );
812
813             // We should always
get a number back from opacity
814             
if ( name == "opacity" && ret == "" )
815                 ret =
"1";
816
817         }
else if ( elem.currentStyle ) {
818             
var camelCase = name.replace(/\-(\w)/g, function(all, letter){
819                 
return letter.toUpperCase();
820             });
821
822             ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
823
824             // From the awesome hack
by Dean Edwards
825             // http://erik.eae.net/archives/
2007/07/27/18.54.15/#comment-102291
826
827             // If we
're not dealing with a regular pixel number
828             // but a number that has a weird ending, we need to convert it to pixels
829             
if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
830                 // Remember the original values
831                 
var left = style.left, rsLeft = elem.runtimeStyle.left;
832
833                 // Put
in the new values to get a computed value out
834                 elem.runtimeStyle.left = elem.currentStyle.left;
835                 style.left = ret ||
0;
836                 ret = style.pixelLeft +
"px";
837
838                 // Revert the changed values
839                 style.left = left;
840                 elem.runtimeStyle.left = rsLeft;
841             }
842         }
843
844         
return ret;
845     },
846
847     clean: function( elems, context, fragment ) {
848         context = context || document;
849
850         // !context.createElement fails
in IE with an error but returns typeof 'object'
851         
if ( typeof context.createElement === "undefined" )
852             context = context.ownerDocument || context[
0] && context[0].ownerDocument || document;
853
854         // If a single
string is passed in and it's a single tag
855         // just
do a createElement and skip the rest
856         
if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
857             
var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
858             
if ( match )
859                 
return [ context.createElement( match[1] ) ];
860         }
861
862         
var ret = [], scripts = [], div = context.createElement("div");
863
864         jQuery.each(elems, function(i, elem){
865             
if ( typeof elem === "number" )
866                 elem +=
'';
867
868             
if ( !elem )
869                 
return;
870
871             // Convert html
string into DOM nodes
872             
if ( typeof elem === "string" ) {
873                 // Fix
"XHTML"-style tags in all browsers
874                 elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
875                     
return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
876                         all :
877                         front +
"></" + tag + ">";
878                 });
879
880                 // Trim whitespace, otherwise indexOf won
't work as expected
881                 
var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
882
883                 
var wrap =
884                     // option or optgroup
885                     !tags.indexOf(
"<opt") &&
886                     [
1, "<select multiple='multiple'>", "</select>" ] ||
887
888                     !tags.indexOf(
"<leg") &&
889                     [
1, "<fieldset>", "</fieldset>" ] ||
890
891                     tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
892                     [
1, "<table>", "</table>" ] ||
893
894                     !tags.indexOf(
"<tr") &&
895                     [
2, "<table><tbody>", "</tbody></table>" ] ||
896
897                     // <thead> matched above
898                     (!tags.indexOf(
"<td") || !tags.indexOf("<th")) &&
899                     [
3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
900
901                     !tags.indexOf(
"<col") &&
902                     [
2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
903
904                     // IE can
't serialize <link> and <script> tags normally
905                     !jQuery.support.htmlSerialize &&
906                     [
1, "div<div>", "</div>" ] ||
907
908                     [
0, "", "" ];
909
910                 // Go to html and back, then peel off extra wrappers
911                 div.innerHTML = wrap[
1] + elem + wrap[2];
912
913                 // Move to the right depth
914                 
while ( wrap[0]-- )
915                     div = div.lastChild;
916
917                 // Remove IE
's autoinserted <tbody> from table fragments
918                 
if ( !jQuery.support.tbody ) {
919
920                     // String was a <table>, *may* have spurious <tbody>
921                     
var hasBody = /<tbody/i.test(elem),
922                         tbody = !tags.indexOf(
"<table") && !hasBody ?
923                             div.firstChild && div.firstChild.childNodes :
924
925                         // String was a bare <thead> or <tfoot>
926                         wrap[
1] == "<table>" && !hasBody ?
927                             div.childNodes :
928                             [];
929
930                     
for ( var j = tbody.length - 1; j >= 0 ; --j )
931                         
if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
932                             tbody[ j ].parentNode.removeChild( tbody[ j ] );
933
934                     }
935
936                 // IE completely kills leading whitespace
when innerHTML is used
937                 
if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
938                     div.insertBefore( context.createTextNode( elem.match(/^\s*/
)[0] ), div.firstChild );
939                 
940                 elem = jQuery.makeArray( div.childNodes );
941             }
942
943             
if ( elem.nodeType )
944                 ret.push( elem );
945             
else
946                 ret = jQuery.merge( ret, elem );
947
948         });
949
950         
if ( fragment ) {
951             
for ( var i = 0; ret[i]; i++ ) {
952                 
if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
953                     scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
954                 }
else {
955                     
if ( ret[i].nodeType === 1 )
956                         ret.splice.apply( ret, [i +
1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
957                     fragment.appendChild( ret[i] );
958                 }
959             }
960             
961             
return scripts;
962         }
963
964         
return ret;
965     },
966
967     attr: function( elem, name,
value ) {
968         
// don't set attributes on text and comment nodes
969         
if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
970             
return undefined;
971
972         
var notxml = !jQuery.isXMLDoc( elem ),
973             
// Whether we are setting (or getting)
974             
set = value !== undefined;
975
976         
// Try to normalize/fix the name
977         name = notxml && jQuery.props[ name ] || name;
978
979         
// Only do all the following if this is a node (faster for style)
980         
// IE elem.getAttribute passes even for style
981         
if ( elem.tagName ) {
982
983             
// These attributes require special treatment
984             
var special = /href|src|style/.test( name );
985
986             
// Safari mis-reports the default selected property of a hidden option
987             
// Accessing the parent's selectedIndex property fixes it
988             
if ( name == "selected" && elem.parentNode )
989                 elem.parentNode.selectedIndex;
990
991             
// If applicable, access the attribute via the DOM 0 way
992             
if ( name in elem && notxml && !special ) {
993                 
if ( set ){
994                     
// We can't allow the type property to be changed (since it causes problems in IE)
995                     
if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
996                         
throw "type property can't be changed";
997
998                     elem[ name ] =
value;
999                 }
1000
1001                 
// browsers index elements by id/name on forms, give priority to attributes.
1002                 
if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
1003                     
return elem.getAttributeNode( name ).nodeValue;
1004
1005                 
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1006                 
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
1007                 
if ( name == "tabIndex" ) {
1008                     
var attributeNode = elem.getAttributeNode( "tabIndex" );
1009                     
return attributeNode && attributeNode.specified
1010                         ? attributeNode.
value
1011                         : elem.nodeName.match(/(button|input|
object|select|textarea)/i)
1012                             ?
0
1013                             : elem.nodeName.match(/^(a|area)$/i) && elem.href
1014                                 ?
0
1015                                 : undefined;
1016                 }
1017
1018                 
return elem[ name ];
1019             }
1020
1021             
if ( !jQuery.support.style && notxml && name == "style" )
1022                 
return jQuery.attr( elem.style, "cssText", value );
1023
1024             
if ( set )
1025                 
// convert the value to a string (all browsers do this but IE) see #1070
1026                 elem.setAttribute( name,
"" + value );
1027
1028             
var attr = !jQuery.support.hrefNormalized && notxml && special
1029                     
// Some attributes require a special call on IE
1030                     ? elem.getAttribute( name,
2 )
1031                     : elem.getAttribute( name );
1032
1033             
// Non-existent attributes return null, we normalize to undefined
1034             
return attr === null ? undefined : attr;
1035         }
1036
1037         
// elem is actually elem.style ... set the style
1038
1039         
// IE uses filters for opacity
1040         
if ( !jQuery.support.opacity && name == "opacity" ) {
1041             
if ( set ) {
1042                 
// IE has trouble with opacity if it does not have layout
1043                 
// Force it by setting the zoom level
1044                 elem.zoom =
1;
1045
1046                 
// Set the alpha filter to set the opacity
1047                 elem.filter = (elem.filter ||
"").replace( /alpha\([^)]*\)/, "" ) +
1048                     (parseInt(
value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
1049             }
1050
1051             
return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
1052                 (parseFloat( elem.filter.match(/opacity=([^)]*)/)[
1] ) / 100) + '':
1053                 
"";
1054         }
1055
1056         name = name.replace(/-([a-z])/ig, function(all, letter){
1057             
return letter.toUpperCase();
1058         });
1059
1060         
if ( set )
1061             elem[ name ] =
value;
1062
1063         
return elem[ name ];
1064     },
1065
1066     trim: function( text ) {
1067         
return (text || "").replace( /^\s+|\s+$/g, "" );
1068     },
1069
1070     makeArray: function( array ) {
1071         
var ret = [];
1072
1073         
if( array != null ){
1074             
var i = array.length;
1075             
// The window, strings (and functions) also have 'length'
1076             
if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
1077                 ret[
0] = array;
1078             
else
1079                 
while( i )
1080                     ret[--i] = array[i];
1081         }
1082
1083         
return ret;
1084     },
1085
1086     inArray: function( elem, array ) {
1087         
for ( var i = 0, length = array.length; i < length; i++ )
1088         
// Use === because on IE, window == document
1089             
if ( array[ i ] === elem )
1090                 
return i;
1091
1092         
return -1;
1093     },
1094
1095     merge: function( first, second ) {
1096         
// We have to loop this way because IE & Opera overwrite the length
1097         
// expando of getElementsByTagName
1098         
var i = 0, elem, pos = first.length;
1099         
// Also, we need to make sure that the correct elements are being returned
1100         
// (IE returns comment nodes in a '*' query)
1101         
if ( !jQuery.support.getAll ) {
1102             
while ( (elem = second[ i++ ]) != null )
1103                 
if ( elem.nodeType != 8 )
1104                     first[ pos++ ] = elem;
1105
1106         }
else
1107             
while ( (elem = second[ i++ ]) != null )
1108                 first[ pos++ ] = elem;
1109
1110         
return first;
1111     },
1112
1113     unique: function( array ) {
1114         
var ret = [], done = {};
1115
1116         
try {
1117
1118             
for ( var i = 0, length = array.length; i < length; i++ ) {
1119                 
var id = jQuery.data( array[ i ] );
1120
1121                 
if ( !done[ id ] ) {
1122                     done[ id ] =
true;
1123                     ret.push( array[ i ] );
1124                 }
1125             }
1126
1127         }
catch( e ) {
1128             ret = array;
1129         }
1130
1131         
return ret;
1132     },
1133
1134     grep: function( elems, callback, inv ) {
1135         
var ret = [];
1136
1137         
// Go through the array, only saving the items
1138         
// that pass the validator function
1139         
for ( var i = 0, length = elems.length; i < length; i++ )
1140             
if ( !inv != !callback( elems[ i ], i ) )
1141                 ret.push( elems[ i ] );
1142
1143         
return ret;
1144     },
1145
1146     map: function( elems, callback ) {
1147         
var ret = [];
1148
1149         
// Go through the array, translating each of the items to their
1150         
// new value (or values).
1151         
for ( var i = 0, length = elems.length; i < length; i++ ) {
1152             
var value = callback( elems[ i ], i );
1153
1154             
if ( value != null )
1155                 ret[ ret.length ] =
value;
1156         }
1157
1158         
return ret.concat.apply( [], ret );
1159     }
1160 });

1161
1162 // Use of jQuery.browser
is deprecated.
1163 // It
's included for backwards compatibility and plugins,
1164 // although they should work to migrate away.

1165
1166 var
userAgent = navigator.userAgent.toLowerCase();
1167
1168 // Figure
out what browser is being used
1169 jQuery.browser = {
1170     version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [
0,'0'])[1],
1171     safari: /webkit/.test( userAgent ),
1172     opera: /opera/.test( userAgent ),
1173     msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
1174     mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
1175 };
1176
1177 jQuery.each({
1178     parent: function(elem){
return elem.parentNode;},
1179     parents: function(elem){
return jQuery.dir(elem,"parentNode");},
1180     next: function(elem){
return jQuery.nth(elem,2,"nextSibling");},
1181     prev: function(elem){
return jQuery.nth(elem,2,"previousSibling");},
1182     nextAll: function(elem){
return jQuery.dir(elem,"nextSibling");},
1183     prevAll: function(elem){
return jQuery.dir(elem,"previousSibling");},
1184     siblings: function(elem){
return jQuery.sibling(elem.parentNode.firstChild,elem);},
1185     children: function(elem){
return jQuery.sibling(elem.firstChild);},
1186     contents: function(elem){
return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
1187 }, function(name, fn){
1188     jQuery.fn[ name ] = function( selector ) {
1189         
var ret = jQuery.map( this, fn );
1190
1191         
if ( selector && typeof selector == "string" )
1192             ret = jQuery.multiFilter( selector, ret );
1193
1194         
return this.pushStack( jQuery.unique( ret ), name, selector );
1195     };
1196 });
1197
1198 jQuery.each({
1199     appendTo:
"append",
1200     prependTo:
"prepend",
1201     insertBefore:
"before",
1202     insertAfter:
"after",
1203     replaceAll:
"replaceWith"
1204 }, function(name, original){
1205     jQuery.fn[ name ] = function( selector ) {
1206         
var ret = [], insert = jQuery( selector );
1207
1208         
for ( var i = 0, l = insert.length; i < l; i++ ) {
1209             
var elems = (i > 0 ? this.clone(true) : this).get();
1210             jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
1211             ret = ret.concat( elems );
1212         }
1213
1214         
return this.pushStack( ret, name, selector );
1215     };
1216 });
1217
1218 jQuery.each({
1219     removeAttr: function( name ) {
1220         jQuery.attr(
this, name, "" );
1221         
if (this.nodeType == 1)
1222             
this.removeAttribute( name );
1223     },
1224
1225     addClass: function( classNames ) {
1226         jQuery.className.
add( this, classNames );
1227     },
1228
1229     removeClass: function( classNames ) {
1230         jQuery.className.
remove( this, classNames );
1231     },
1232
1233     toggleClass: function( classNames, state ) {
1234         
if( typeof state !== "boolean" )
1235             state = !jQuery.className.has(
this, classNames );
1236         jQuery.className[ state ?
"add" : "remove" ]( this, classNames );
1237     },
1238
1239     
remove: function( selector ) {
1240         
if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
1241             
// Prevent memory leaks
1242             jQuery(
"*", this ).add([this]).each(function(){
1243                 jQuery.
event.remove(this);
1244                 jQuery.removeData(
this);
1245             });
1246             
if (this.parentNode)
1247                 
this.parentNode.removeChild( this );
1248         }
1249     },
1250
1251     empty: function() {
1252         
// Remove element nodes and prevent memory leaks
1253         jQuery(
this).children().remove();
1254
1255         
// Remove any remaining nodes
1256         
while ( this.firstChild )
1257             
this.removeChild( this.firstChild );
1258     }
1259 }, function(name, fn){
1260     jQuery.fn[ name ] = function(){
1261         
return this.each( fn, arguments );
1262     };
1263 });

1264
1265 // Helper function used
by the dimensions and offset modules
1266 function num(elem, prop) {
1267     
return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
1268 }

1269 var
expando = "jQuery" + now(), uuid = 0, windowData = {};
1270
1271 jQuery.extend({
1272     cache: {},
1273
1274     data: function( elem, name, data ) {
1275         elem = elem == window ?
1276             windowData :
1277             elem;
1278
1279         
var id = elem[ expando ];
1280
1281         
// Compute a unique ID for the element
1282         
if ( !id )
1283             id = elem[ expando ] = ++uuid;
1284
1285         
// Only generate the data cache if we're
1286         
// trying to access or manipulate it
1287         
if ( name && !jQuery.cache[ id ] )
1288             jQuery.cache[ id ] = {};
1289
1290         
// Prevent overriding the named cache with undefined values
1291         
if ( data !== undefined )
1292             jQuery.cache[ id ][ name ] = data;
1293
1294         
// Return the named cache data, or the ID for the element
1295         
return name ?
1296             jQuery.cache[ id ][ name ] :
1297             id;
1298     },
1299
1300     removeData: function( elem, name ) {
1301         elem = elem == window ?
1302             windowData :
1303             elem;
1304
1305         
var id = elem[ expando ];
1306
1307         
// If we want to remove a specific section of the element's data
1308         
if ( name ) {
1309             
if ( jQuery.cache[ id ] ) {
1310                 
// Remove the section of cache data
1311                 delete jQuery.cache[ id ][ name ];
1312
1313                 
// If we've removed all the data, remove the element's cache
1314                 name =
"";
1315
1316                 
for ( name in jQuery.cache[ id ] )
1317                     
break;
1318
1319                 
if ( !name )
1320                     jQuery.removeData( elem );
1321             }
1322
1323         
// Otherwise, we want to remove all of the element's data
1324         }
else {
1325             
// Clean up the element expando
1326             
try {
1327                 delete elem[ expando ];
1328             }
catch(e){
1329                 
// IE has trouble directly removing the expando
1330                 
// but it's ok with using removeAttribute
1331                 
if ( elem.removeAttribute )
1332                     elem.removeAttribute( expando );
1333             }
1334
1335             
// Completely remove the data cache
1336             delete jQuery.cache[ id ];
1337         }
1338     },
1339     queue: function( elem, type, data ) {
1340         
if ( elem ){
1341     
1342             type = (type ||
"fx") + "queue";
1343     
1344             
var q = jQuery.data( elem, type );
1345     
1346             
if ( !q || jQuery.isArray(data) )
1347                 q = jQuery.data( elem, type, jQuery.makeArray(data) );
1348             
else if( data )
1349                 q.push( data );
1350     
1351         }
1352         
return q;
1353     },
1354
1355     dequeue: function( elem, type ){
1356         
var queue = jQuery.queue( elem, type ),
1357             fn = queue.shift();
1358         
1359         
if( !type || type === "fx" )
1360             fn = queue[
0];
1361             
1362         
if( fn !== undefined )
1363             fn.call(elem);
1364     }
1365 });
1366
1367 jQuery.fn.extend({
1368     data: function( key,
value ){
1369         
var parts = key.split(".");
1370         parts[
1] = parts[1] ? "." + parts[1] : "";
1371
1372         
if ( value === undefined ) {
1373             
var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1374
1375             
if ( data === undefined && this.length )
1376                 data = jQuery.data(
this[0], key );
1377
1378             
return data === undefined && parts[1] ?
1379                 
this.data( parts[0] ) :
1380                 data;
1381         }
else
1382             
return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
1383                 jQuery.data(
this, key, value );
1384             });
1385     },
1386
1387     removeData: function( key ){
1388         
return this.each(function(){
1389             jQuery.removeData(
this, key );
1390         });
1391     },
1392     queue: function(type, data){
1393         
if ( typeof type !== "string" ) {
1394             data = type;
1395             type =
"fx";
1396         }
1397
1398         
if ( data === undefined )
1399             
return jQuery.queue( this[0], type );
1400
1401         
return this.each(function(){
1402             
var queue = jQuery.queue( this, type, data );
1403             
1404              
if( type == "fx" && queue.length == 1 )
1405                 queue[
0].call(this);
1406         });
1407     },
1408     dequeue: function(type){
1409         
return this.each(function(){
1410             jQuery.dequeue(
this, type );
1411         });
1412     }
1413 });
/*!
1414  * Sizzle CSS Selector Engine - v0.
9.3
1415  * Copyright
2009, The Dojo Foundation
1416  * Released under the MIT, BSD, and GPL Licenses.
1417  * More information: http://sizzlejs.com/
1418  */

1419 (function(){

1420
1421 var
chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
1422     done =
0,
1423     toString = Object.prototype.toString;

1424
1425 var
Sizzle = function(selector, context, results, seed) {
1426     results = results || [];
1427     context = context || document;
1428
1429     
if ( context.nodeType !== 1 && context.nodeType !== 9 )
1430         
return [];
1431     
1432     
if ( !selector || typeof selector !== "string" ) {
1433         
return results;
1434     }
1435
1436     
var parts = [], m, set, checkSet, check, mode, extra, prune = true;
1437     
1438     
// Reset the position of the chunker regexp (start from head)
1439     chunker.lastIndex =
0;
1440     
1441     
while ( (m = chunker.exec(selector)) !== null ) {
1442         parts.push( m[
1] );
1443         
1444         
if ( m[2] ) {
1445             extra = RegExp.rightContext;
1446             
break;
1447         }
1448     }
1449
1450     
if ( parts.length > 1 && origPOS.exec( selector ) ) {
1451         
if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
1452             
set = posProcess( parts[0] + parts[1], context );
1453         }
else {
1454             
set = Expr.relative[ parts[0] ] ?
1455                 [ context ] :
1456                 Sizzle( parts.shift(), context );
1457
1458             
while ( parts.length ) {
1459                 selector = parts.shift();
1460
1461                 
if ( Expr.relative[ selector ] )
1462                     selector += parts.shift();
1463
1464                 
set = posProcess( selector, set );
1465             }
1466         }
1467     }
else {
1468         
var ret = seed ?
1469             { expr: parts.pop(),
set: makeArray(seed) } :
1470             Sizzle.find( parts.pop(), parts.length ===
1 && context.parentNode ? context.parentNode : context, isXML(context) );
1471         
set = Sizzle.filter( ret.expr, ret.set );
1472
1473         
if ( parts.length > 0 ) {
1474             checkSet = makeArray(
set);
1475         }
else {
1476             prune =
false;
1477         }
1478
1479         
while ( parts.length ) {
1480             
var cur = parts.pop(), pop = cur;
1481
1482             
if ( !Expr.relative[ cur ] ) {
1483                 cur =
"";
1484             }
else {
1485                 pop = parts.pop();
1486             }
1487
1488             
if ( pop == null ) {
1489                 pop = context;
1490             }
1491
1492             Expr.relative[ cur ]( checkSet, pop, isXML(context) );
1493         }
1494     }
1495
1496     
if ( !checkSet ) {
1497         checkSet =
set;
1498     }
1499
1500     
if ( !checkSet ) {
1501         
throw "Syntax error, unrecognized expression: " + (cur || selector);
1502     }
1503
1504     
if ( toString.call(checkSet) === "[object Array]" ) {
1505         
if ( !prune ) {
1506             results.push.apply( results, checkSet );
1507         }
else if ( context.nodeType === 1 ) {
1508             
for ( var i = 0; checkSet[i] != null; i++ ) {
1509                 
if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
1510                     results.push(
set[i] );
1511                 }
1512             }
1513         }
else {
1514             
for ( var i = 0; checkSet[i] != null; i++ ) {
1515                 
if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
1516                     results.push(
set[i] );
1517                 }
1518             }
1519         }
1520     }
else {
1521         makeArray( checkSet, results );
1522     }
1523
1524     
if ( extra ) {
1525         Sizzle( extra, context, results, seed );
1526
1527         
if ( sortOrder ) {
1528             hasDuplicate =
false;
1529             results.sort(sortOrder);
1530
1531             
if ( hasDuplicate ) {
1532                 
for ( var i = 1; i < results.length; i++ ) {
1533                     
if ( results[i] === results[i-1] ) {
1534                         results.splice(i--,
1);
1535                     }
1536                 }
1537             }
1538         }
1539     }
1540
1541     
return results;
1542 };
1543
1544 Sizzle.matches = function(expr,
set){
1545     
return Sizzle(expr, null, null, set);
1546 };
1547
1548 Sizzle.find = function(expr, context, isXML){
1549     
var set, match;
1550
1551     
if ( !expr ) {
1552         
return [];
1553     }
1554
1555     
for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
1556         
var type = Expr.order[i], match;
1557         
1558         
if ( (match = Expr.match[ type ].exec( expr )) ) {
1559             
var left = RegExp.leftContext;
1560
1561             
if ( left.substr( left.length - 1 ) !== "\\" ) {
1562                 match[
1] = (match[1] || "").replace(/\\/g, "");
1563                 
set = Expr.find[ type ]( match, context, isXML );
1564                 
if ( set != null ) {
1565                     expr = expr.replace( Expr.match[ type ],
"" );
1566                     
break;
1567                 }
1568             }
1569         }
1570     }
1571
1572     
if ( !set ) {
1573         
set = context.getElementsByTagName("*");
1574     }
1575
1576     
return {set: set, expr: expr};
1577 };
1578
1579 Sizzle.filter = function(expr,
set, inplace, not){
1580     
var old = expr, result = [], curLoop = set, match, anyFound,
1581         isXMLFilter =
set && set[0] && isXML(set[0]);
1582
1583     
while ( expr && set.length ) {
1584         
for ( var type in Expr.filter ) {
1585             
if ( (match = Expr.match[ type ].exec( expr )) != null ) {
1586                 
var filter = Expr.filter[ type ], found, item;
1587                 anyFound =
false;
1588
1589                 
if ( curLoop == result ) {
1590                     result = [];
1591                 }
1592
1593                 
if ( Expr.preFilter[ type ] ) {
1594                     match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
1595
1596                     
if ( !match ) {
1597                         anyFound = found =
true;
1598                     }
else if ( match === true ) {
1599                         
continue;
1600                     }
1601                 }
1602
1603                 
if ( match ) {
1604                     
for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
1605                         
if ( item ) {
1606                             found = filter( item, match, i, curLoop );
1607                             
var pass = not ^ !!found;
1608
1609                             
if ( inplace && found != null ) {
1610                                 
if ( pass ) {
1611                                     anyFound =
true;
1612                                 }
else {
1613                                     curLoop[i] =
false;
1614                                 }
1615                             }
else if ( pass ) {
1616                                 result.push( item );
1617                                 anyFound =
true;
1618                             }
1619                         }
1620                     }
1621                 }
1622
1623                 
if ( found !== undefined ) {
1624                     
if ( !inplace ) {
1625                         curLoop = result;
1626                     }
1627
1628                     expr = expr.replace( Expr.match[ type ],
"" );
1629
1630                     
if ( !anyFound ) {
1631                         
return [];
1632                     }
1633
1634                     
break;
1635                 }
1636             }
1637         }
1638
1639         
// Improper expression
1640         
if ( expr == old ) {
1641             
if ( anyFound == null ) {
1642                 
throw "Syntax error, unrecognized expression: " + expr;
1643             }
else {
1644                 
break;
1645             }
1646         }
1647
1648         old = expr;
1649     }
1650
1651     
return curLoop;
1652 };

1653
1654 var
Expr = Sizzle.selectors = {
1655     order: [
"ID", "NAME", "TAG" ],
1656     match: {
1657         ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1658         CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
1659         NAME: /\[name=[
'"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
1660         ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"
]*)(.*?)\3|)\s*\]/,
1661         TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
1662         CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
1663         POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
1664         PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\(([
'"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
1665     },
1666     attrMap: {
1667         
"class": "className",
1668         
"for": "htmlFor"
1669     },
1670     attrHandle: {
1671         href: function(elem){
1672             
return elem.getAttribute("href");
1673         }
1674     },
1675     relative: {
1676         
"+": function(checkSet, part, isXML){
1677             
var isPartStr = typeof part === "string",
1678                 isTag = isPartStr && !/\W/.test(part),
1679                 isPartStrNotTag = isPartStr && !isTag;
1680
1681             
if ( isTag && !isXML ) {
1682                 part = part.toUpperCase();
1683             }
1684
1685             
for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
1686                 
if ( (elem = checkSet[i]) ) {
1687                     
while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
1688
1689                     checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
1690                         elem ||
false :
1691                         elem === part;
1692                 }
1693             }
1694
1695             
if ( isPartStrNotTag ) {
1696                 Sizzle.filter( part, checkSet,
true );
1697             }
1698         },
1699         
">": function(checkSet, part, isXML){
1700             
var isPartStr = typeof part === "string";
1701
1702             
if ( isPartStr && !/\W/.test(part) ) {
1703                 part = isXML ? part : part.toUpperCase();
1704
1705                 
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1706                     
var elem = checkSet[i];
1707                     
if ( elem ) {
1708                         
var parent = elem.parentNode;
1709                         checkSet[i] = parent.nodeName === part ? parent :
false;
1710                     }
1711                 }
1712             }
else {
1713                 
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
1714                     
var elem = checkSet[i];
1715                     
if ( elem ) {
1716                         checkSet[i] = isPartStr ?
1717                             elem.parentNode :
1718                             elem.parentNode === part;
1719                     }
1720                 }
1721
1722                 
if ( isPartStr ) {
1723                     Sizzle.filter( part, checkSet,
true );
1724                 }
1725             }
1726         },
1727         
"": function(checkSet, part, isXML){
1728             
var doneName = done++, checkFn = dirCheck;
1729
1730             
if ( !part.match(/\W/) ) {
1731                 
var nodeCheck = part = isXML ? part : part.toUpperCase();
1732                 checkFn = dirNodeCheck;
1733             }
1734
1735             checkFn(
"parentNode", part, doneName, checkSet, nodeCheck, isXML);
1736         },
1737         
"~": function(checkSet, part, isXML){
1738             
var doneName = done++, checkFn = dirCheck;
1739
1740             
if ( typeof part === "string" && !part.match(/\W/) ) {
1741                 
var nodeCheck = part = isXML ? part : part.toUpperCase();
1742                 checkFn = dirNodeCheck;
1743             }
1744
1745             checkFn(
"previousSibling", part, doneName, checkSet, nodeCheck, isXML);
1746         }
1747     },
1748     find: {
1749         ID: function(match, context, isXML){
1750             
if ( typeof context.getElementById !== "undefined" && !isXML ) {
1751                 
var m = context.getElementById(match[1]);
1752                 
return m ? [m] : [];
1753             }
1754         },
1755         NAME: function(match, context, isXML){
1756             
if ( typeof context.getElementsByName !== "undefined" ) {
1757                 
var ret = [], results = context.getElementsByName(match[1]);
1758
1759                 
for ( var i = 0, l = results.length; i < l; i++ ) {
1760                     
if ( results[i].getAttribute("name") === match[1] ) {
1761                         ret.push( results[i] );
1762                     }
1763                 }
1764
1765                 
return ret.length === 0 ? null : ret;
1766             }
1767         },
1768         TAG: function(match, context){
1769             
return context.getElementsByTagName(match[1]);
1770         }
1771     },
1772     preFilter: {
1773         CLASS: function(match, curLoop, inplace, result, not, isXML){
1774             match =
" " + match[1].replace(/\\/g, "") + " ";
1775
1776             
if ( isXML ) {
1777                 
return match;
1778             }
1779
1780             
for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
1781                 
if ( elem ) {
1782                     
if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
1783                         
if ( !inplace )
1784                             result.push( elem );
1785                     }
else if ( inplace ) {
1786                         curLoop[i] =
false;
1787                     }
1788                 }
1789             }
1790
1791             
return false;
1792         },
1793         ID: function(match){
1794             
return match[1].replace(/\\/g, "");
1795         },
1796         TAG: function(match, curLoop){
1797             
for ( var i = 0; curLoop[i] === false; i++ ){}
1798             
return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
1799         },
1800         CHILD: function(match){
1801             
if ( match[1] == "nth" ) {
1802                 
// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
1803                 
var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
1804                     match[
2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
1805                     !/\D/.test( match[
2] ) && "0n+" + match[2] || match[2]);
1806
1807                 
// calculate the numbers (first)n+(last) including if they are negative
1808                 match[
2] = (test[1] + (test[2] || 1)) - 0;
1809                 match[
3] = test[3] - 0;
1810             }
1811
1812             
// TODO: Move to normal caching system
1813             match[
0] = done++;
1814
1815             
return match;
1816         },
1817         ATTR: function(match, curLoop, inplace, result, not, isXML){
1818             
var name = match[1].replace(/\\/g, "");
1819             
1820             
if ( !isXML && Expr.attrMap[name] ) {
1821                 match[
1] = Expr.attrMap[name];
1822             }
1823
1824             
if ( match[2] === "~=" ) {
1825                 match[
4] = " " + match[4] + " ";
1826             }
1827
1828             
return match;
1829         },
1830         PSEUDO: function(match, curLoop, inplace, result, not){
1831             
if ( match[1] === "not" ) {
1832                 
// If we're dealing with a complex expression, or a simple one
1833                 
if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
1834                     match[
3] = Sizzle(match[3], null, null, curLoop);
1835                 }
else {
1836                     
var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
1837                     
if ( !inplace ) {
1838                         result.push.apply( result, ret );
1839                     }
1840                     
return false;
1841                 }
1842             }
else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
1843                 
return true;
1844             }
1845             
1846             
return match;
1847         },
1848         POS: function(match){
1849             match.unshift(
true );
1850             
return match;
1851         }
1852     },
1853     filters: {
1854         enabled: function(elem){
1855             
return elem.disabled === false && elem.type !== "hidden";
1856         },
1857         disabled: function(elem){
1858             
return elem.disabled === true;
1859         },
1860         
checked: function(elem){
1861             
return elem.checked === true;
1862         },
1863         selected: function(elem){
1864             
// Accessing this property makes selected-by-default
1865             
// options in Safari work properly
1866             elem.parentNode.selectedIndex;
1867             
return elem.selected === true;
1868         },
1869         parent: function(elem){
1870             
return !!elem.firstChild;
1871         },
1872         empty: function(elem){
1873             
return !elem.firstChild;
1874         },
1875         has: function(elem, i, match){
1876             
return !!Sizzle( match[3], elem ).length;
1877         },
1878         header: function(elem){
1879             
return /h\d/i.test( elem.nodeName );
1880         },
1881         text: function(elem){
1882             
return "text" === elem.type;
1883         },
1884         radio: function(elem){
1885             
return "radio" === elem.type;
1886         },
1887         checkbox: function(elem){
1888             
return "checkbox" === elem.type;
1889         },
1890         file: function(elem){
1891             
return "file" === elem.type;
1892         },
1893         password: function(elem){
1894             
return "password" === elem.type;
1895         },
1896         submit: function(elem){
1897             
return "submit" === elem.type;
1898         },
1899         image: function(elem){
1900             
return "image" === elem.type;
1901         },
1902         reset: function(elem){
1903             
return "reset" === elem.type;
1904         },
1905         button: function(elem){
1906             
return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
1907         },
1908         input: function(elem){
1909             
return /input|select|textarea|button/i.test(elem.nodeName);
1910         }
1911     },
1912     setFilters: {
1913         first: function(elem, i){
1914             
return i === 0;
1915         },
1916         last: function(elem, i, match, array){
1917             
return i === array.length - 1;
1918         },
1919         even: function(elem, i){
1920             
return i % 2 === 0;
1921         },
1922         odd: function(elem, i){
1923             
return i % 2 === 1;
1924         },
1925         lt: function(elem, i, match){
1926             
return i < match[3] - 0;
1927         },
1928         gt: function(elem, i, match){
1929             
return i > match[3] - 0;
1930         },
1931         nth: function(elem, i, match){
1932             
return match[3] - 0 == i;
1933         },
1934         eq: function(elem, i, match){
1935             
return match[3] - 0 == i;
1936         }
1937     },
1938     filter: {
1939         PSEUDO: function(elem, match, i, array){
1940             
var name = match[1], filter = Expr.filters[ name ];
1941
1942             
if ( filter ) {
1943                 
return filter( elem, i, match, array );
1944             }
else if ( name === "contains" ) {
1945                 
return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
1946             }
else if ( name === "not" ) {
1947                 
var not = match[3];
1948
1949                 
for ( var i = 0, l = not.length; i < l; i++ ) {
1950                     
if ( not[i] === elem ) {
1951                         
return false;
1952                     }
1953                 }
1954
1955                 
return true;
1956             }
1957         },
1958         CHILD: function(elem, match){
1959             
var type = match[1], node = elem;
1960             
switch (type) {
1961                 
case 'only':
1962                 
case 'first':
1963                     
while (node = node.previousSibling) {
1964                         
if ( node.nodeType === 1 ) return false;
1965                     }
1966                     
if ( type == 'first') return true;
1967                     node = elem;
1968                 
case 'last':
1969                     
while (node = node.nextSibling) {
1970                         
if ( node.nodeType === 1 ) return false;
1971                     }
1972                     
return true;
1973                 
case 'nth':
1974                     
var first = match[2], last = match[3];
1975
1976                     
if ( first == 1 && last == 0 ) {
1977                         
return true;
1978                     }
1979                     
1980                     
var doneName = match[0],
1981                         parent = elem.parentNode;
1982     
1983                     
if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
1984                         
var count = 0;
1985                         
for ( node = parent.firstChild; node; node = node.nextSibling ) {
1986                             
if ( node.nodeType === 1 ) {
1987                                 node.nodeIndex = ++count;
1988                             }
1989                         }
1990                         parent.sizcache = doneName;
1991                     }
1992                     
1993                     
var diff = elem.nodeIndex - last;
1994                     
if ( first == 0 ) {
1995                         
return diff == 0;
1996                     }
else {
1997                         
return ( diff % first == 0 && diff / first >= 0 );
1998                     }
1999             }
2000         },
2001         ID: function(elem, match){
2002             
return elem.nodeType === 1 && elem.getAttribute("id") === match;
2003         },
2004         TAG: function(elem, match){
2005             
return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
2006         },
2007         CLASS: function(elem, match){
2008             
return (" " + (elem.className || elem.getAttribute("class")) + " ")
2009                 .indexOf( match ) > -
1;
2010         },
2011         ATTR: function(elem, match){
2012             
var name = match[1],
2013                 result = Expr.attrHandle[ name ] ?
2014                     Expr.attrHandle[ name ]( elem ) :
2015                     elem[ name ] !=
null ?
2016                         elem[ name ] :
2017                         elem.getAttribute( name ),
2018                 
value = result + "",
2019                 type = match[
2],
2020                 check = match[
4];
2021
2022             
return result == null ?
2023                 type ===
"!=" :
2024                 type ===
"=" ?
2025                 
value === check :
2026                 type ===
"*=" ?
2027                 
value.indexOf(check) >= 0 :
2028                 type ===
"~=" ?
2029                 (
" " + value + " ").indexOf(check) >= 0 :
2030                 !check ?
2031                 
value && result !== false :
2032                 type ===
"!=" ?
2033                 
value != check :
2034                 type ===
"^=" ?
2035                 
value.indexOf(check) === 0 :
2036                 type ===
"$=" ?
2037                 
value.substr(value.length - check.length) === check :
2038                 type ===
"|=" ?
2039                 
value === check || value.substr(0, check.length + 1) === check + "-" :
2040                 
false;
2041         },
2042         POS: function(elem, match, i, array){
2043             
var name = match[2], filter = Expr.setFilters[ name ];
2044
2045             
if ( filter ) {
2046                 
return filter( elem, i, match, array );
2047             }
2048         }
2049     }
2050 };

2051
2052 var
origPOS = Expr.match.POS;
2053
2054 for
( var type in Expr.match ) {
2055     Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
2056 }

2057
2058 var
makeArray = function(array, results) {
2059     array = Array.prototype.slice.call( array );
2060
2061     
if ( results ) {
2062         results.push.apply( results, array );
2063         
return results;
2064     }
2065     
2066     
return array;
2067 };

2068
2069 // Perform a simple check to determine
if the browser is capable of
2070 // converting a NodeList to an array
using builtin methods.
2071 try
{
2072     Array.prototype.slice.call( document.documentElement.childNodes );

2073
2074 // Provide a fallback method
if it does not work
2075 }
catch(e){
2076     makeArray = function(array, results) {
2077         
var ret = results || [];
2078
2079         
if ( toString.call(array) === "[object Array]" ) {
2080             Array.prototype.push.apply( ret, array );
2081         }
else {
2082             
if ( typeof array.length === "number" ) {
2083                 
for ( var i = 0, l = array.length; i < l; i++ ) {
2084                     ret.push( array[i] );
2085                 }
2086             }
else {
2087                 
for ( var i = 0; array[i]; i++ ) {
2088                     ret.push( array[i] );
2089                 }
2090             }
2091         }
2092
2093         
return ret;
2094     };
2095 }

2096
2097 var
sortOrder;
2098
2099 if
( document.documentElement.compareDocumentPosition ) {
2100     sortOrder = function( a, b ) {
2101         
var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
2102         
if ( ret === 0 ) {
2103             hasDuplicate =
true;
2104         }
2105         
return ret;
2106     };
2107 }
else if ( "sourceIndex" in document.documentElement ) {
2108     sortOrder = function( a, b ) {
2109         
var ret = a.sourceIndex - b.sourceIndex;
2110         
if ( ret === 0 ) {
2111             hasDuplicate =
true;
2112         }
2113         
return ret;
2114     };
2115 }
else if ( document.createRange ) {
2116     sortOrder = function( a, b ) {
2117         
var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
2118         aRange.selectNode(a);
2119         aRange.collapse(
true);
2120         bRange.selectNode(b);
2121         bRange.collapse(
true);
2122         
var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
2123         
if ( ret === 0 ) {
2124             hasDuplicate =
true;
2125         }
2126         
return ret;
2127     };
2128 }

2129
2130 // Check to see
if the browser returns elements by name when
2131 // querying
by getElementById (and provide a workaround)
2132 (function(){
2133     
// We're going to inject a fake input element with a specified name
2134     
var form = document.createElement("form"),
2135         id =
"script" + (new Date).getTime();
2136     form.innerHTML =
"<input name='" + id + "'/>";
2137
2138     
// Inject it into the root element, check its status, and remove it quickly
2139     
var root = document.documentElement;
2140     root.insertBefore( form, root.firstChild );
2141
2142     
// The workaround has to do additional checks after a getElementById
2143     
// Which slows things down for other browsers (hence the branching)
2144     
if ( !!document.getElementById( id ) ) {
2145         Expr.find.ID = function(match, context, isXML){
2146             
if ( typeof context.getElementById !== "undefined" && !isXML ) {
2147                 
var m = context.getElementById(match[1]);
2148                 
return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
2149             }
2150         };
2151
2152         Expr.filter.ID = function(elem, match){
2153             
var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
2154             
return elem.nodeType === 1 && node && node.nodeValue === match;
2155         };
2156     }
2157
2158     root.removeChild( form );
2159 })();
2160
2161 (function(){
2162     
// Check to see if the browser returns only elements
2163     
// when doing getElementsByTagName("*")
2164
2165     
// Create a fake element
2166     
var div = document.createElement("div");
2167     div.appendChild( document.createComment(
"") );
2168
2169     
// Make sure no comments are found
2170     
if ( div.getElementsByTagName("*").length > 0 ) {
2171         Expr.find.TAG = function(match, context){
2172             
var results = context.getElementsByTagName(match[1]);
2173
2174             
// Filter out possible comments
2175             
if ( match[1] === "*" ) {
2176                 
var tmp = [];
2177
2178                 
for ( var i = 0; results[i]; i++ ) {
2179                     
if ( results[i].nodeType === 1 ) {
2180                         tmp.push( results[i] );
2181                     }
2182                 }
2183
2184                 results = tmp;
2185             }
2186
2187             
return results;
2188         };
2189     }
2190
2191     
// Check to see if an attribute returns normalized href attributes
2192     div.innerHTML =
"<a href='#'></a>";
2193     
if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
2194             div.firstChild.getAttribute(
"href") !== "#" ) {
2195         Expr.attrHandle.href = function(elem){
2196             
return elem.getAttribute("href", 2);
2197         };
2198     }
2199 })();

2200
2201 if
( document.querySelectorAll ) (function(){
2202     
var oldSizzle = Sizzle, div = document.createElement("div");
2203     div.innerHTML =
"<p class='TEST'></p>";
2204
2205     
// Safari can't handle uppercase or unicode characters when
2206     
// in quirks mode.
2207     
if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
2208         
return;
2209     }
2210     
2211     Sizzle = function(query, context, extra, seed){
2212         context = context || document;
2213
2214         
// Only use querySelectorAll on non-XML documents
2215         
// (ID selectors don't work in non-HTML documents)
2216         
if ( !seed && context.nodeType === 9 && !isXML(context) ) {
2217             
try {
2218                 
return makeArray( context.querySelectorAll(query), extra );
2219             }
catch(e){}
2220         }
2221         
2222         
return oldSizzle(query, context, extra, seed);
2223     };
2224
2225     Sizzle.find = oldSizzle.find;
2226     Sizzle.filter = oldSizzle.filter;
2227     Sizzle.selectors = oldSizzle.selectors;
2228     Sizzle.matches = oldSizzle.matches;
2229 })();

2230
2231 if
( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
2232     
var div = document.createElement("div");
2233     div.innerHTML =
"<div class='test e'></div><div class='test'></div>";
2234
2235     
// Opera can't find a second classname (in 9.6)
2236     
if ( div.getElementsByClassName("e").length === 0 )
2237         
return;
2238
2239     
// Safari caches class attributes, doesn't catch changes (in 3.2)
2240     div.lastChild.className =
"e";
2241
2242     
if ( div.getElementsByClassName("e").length === 1 )
2243         
return;
2244
2245     Expr.order.splice(
1, 0, "CLASS");
2246     Expr.find.CLASS = function(match, context, isXML) {
2247         
if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
2248             
return context.getElementsByClassName(match[1]);
2249         }
2250     };
2251 })();
2252
2253 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2254     
var sibDir = dir == "previousSibling" && !isXML;
2255     
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2256         
var elem = checkSet[i];
2257         
if ( elem ) {
2258             
if ( sibDir && elem.nodeType === 1 ){
2259                 elem.sizcache = doneName;
2260                 elem.sizset = i;
2261             }
2262             elem = elem[dir];
2263             
var match = false;
2264
2265             
while ( elem ) {
2266                 
if ( elem.sizcache === doneName ) {
2267                     match = checkSet[elem.sizset];
2268                     
break;
2269                 }
2270
2271                 
if ( elem.nodeType === 1 && !isXML ){
2272                     elem.sizcache = doneName;
2273                     elem.sizset = i;
2274                 }
2275
2276                 
if ( elem.nodeName === cur ) {
2277                     match = elem;
2278                     
break;
2279                 }
2280
2281                 elem = elem[dir];
2282             }
2283
2284             checkSet[i] = match;
2285         }
2286     }
2287 }
2288
2289 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
2290     
var sibDir = dir == "previousSibling" && !isXML;
2291     
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2292         
var elem = checkSet[i];
2293         
if ( elem ) {
2294             
if ( sibDir && elem.nodeType === 1 ) {
2295                 elem.sizcache = doneName;
2296                 elem.sizset = i;
2297             }
2298             elem = elem[dir];
2299             
var match = false;
2300
2301             
while ( elem ) {
2302                 
if ( elem.sizcache === doneName ) {
2303                     match = checkSet[elem.sizset];
2304                     
break;
2305                 }
2306
2307                 
if ( elem.nodeType === 1 ) {
2308                     
if ( !isXML ) {
2309                         elem.sizcache = doneName;
2310                         elem.sizset = i;
2311                     }
2312                     
if ( typeof cur !== "string" ) {
2313                         
if ( elem === cur ) {
2314                             match =
true;
2315                             
break;
2316                         }
2317
2318                     }
else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
2319                         match = elem;
2320                         
break;
2321                     }
2322                 }
2323
2324                 elem = elem[dir];
2325             }
2326
2327             checkSet[i] = match;
2328         }
2329     }
2330 }

2331
2332 var
contains = document.compareDocumentPosition ? function(a, b){
2333     
return a.compareDocumentPosition(b) & 16;
2334 } : function(a, b){
2335     
return a !== b && (a.contains ? a.contains(b) : true);
2336 };

2337
2338 var
isXML = function(elem){
2339     
return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
2340         !!elem.ownerDocument && isXML( elem.ownerDocument );
2341 };

2342
2343 var
posProcess = function(selector, context){
2344     
var tmpSet = [], later = "", match,
2345         root = context.nodeType ? [context] : context;
2346
2347     
// Position selectors must be done after the filter
2348     
// And so must :not(positional) so we move all PSEUDOs to the end
2349     
while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
2350         later += match[
0];
2351         selector = selector.replace( Expr.match.PSEUDO,
"" );
2352     }
2353
2354     selector = Expr.relative[selector] ? selector +
"*" : selector;
2355
2356     
for ( var i = 0, l = root.length; i < l; i++ ) {
2357         Sizzle( selector, root[i], tmpSet );
2358     }
2359
2360     
return Sizzle.filter( later, tmpSet );
2361 };

2362
2363 // EXPOSE

2364 jQuery.find = Sizzle;
2365 jQuery.filter = Sizzle.filter;
2366 jQuery.expr = Sizzle.selectors;
2367 jQuery.expr[
":"] = jQuery.expr.filters;
2368
2369 Sizzle.selectors.filters.hidden = function(elem){
2370     
return elem.offsetWidth === 0 || elem.offsetHeight === 0;
2371 };
2372
2373 Sizzle.selectors.filters.visible = function(elem){
2374     
return elem.offsetWidth > 0 || elem.offsetHeight > 0;
2375 };
2376
2377 Sizzle.selectors.filters.animated = function(elem){
2378     
return jQuery.grep(jQuery.timers, function(fn){
2379         
return elem === fn.elem;
2380     }).length;
2381 };
2382
2383 jQuery.multiFilter = function( expr, elems, not ) {
2384     
if ( not ) {
2385         expr =
":not(" + expr + ")";
2386     }
2387
2388     
return Sizzle.matches(expr, elems);
2389 };
2390
2391 jQuery.dir = function( elem, dir ){
2392     
var matched = [], cur = elem[dir];
2393     
while ( cur && cur != document ) {
2394         
if ( cur.nodeType == 1 )
2395             matched.push( cur );
2396         cur = cur[dir];
2397     }
2398     
return matched;
2399 };
2400
2401 jQuery.nth = function(cur, result, dir, elem){
2402     result = result ||
1;
2403     
var num = 0;
2404
2405     
for ( ; cur; cur = cur[dir] )
2406         
if ( cur.nodeType == 1 && ++num == result )
2407             
break;
2408
2409     
return cur;
2410 };
2411
2412 jQuery.sibling = function(n, elem){
2413     
var r = [];
2414
2415     
for ( ; n; n = n.nextSibling ) {
2416         
if ( n.nodeType == 1 && n != elem )
2417             r.push( n );
2418     }
2419
2420     
return r;
2421 };

2422
2423 return
;
2424
2425 window.Sizzle = Sizzle;
2426
2427 })();

2428 /*
2429  * A number of helper functions used
for managing events.
2430  * Many of the ideas behind
this code originated from
2431  * Dean Edwards
' addEvent library.
2432  */

2433 jQuery.
event = {
2434
2435     
// Bind an event to an element
2436     
// Original by Dean Edwards
2437     
add: function(elem, types, handler, data) {
2438         
if ( elem.nodeType == 3 || elem.nodeType == 8 )
2439             
return;
2440
2441         
// For whatever reason, IE has trouble passing the window object
2442         
// around, causing it to be cloned in the process
2443         
if ( elem.setInterval && elem != window )
2444             elem = window;
2445
2446         
// Make sure that the function being executed has a unique ID
2447         
if ( !handler.guid )
2448             handler.guid =
this.guid++;
2449
2450         
// if data is passed, bind to handler
2451         
if ( data !== undefined ) {
2452             
// Create temporary function pointer to original handler
2453             
var fn = handler;
2454
2455             
// Create unique handler function, wrapped around original handler
2456             handler =
this.proxy( fn );
2457
2458             
// Store data in unique handler
2459             handler.data = data;
2460         }
2461
2462         
// Init the element's event structure
2463         
var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
2464             handle = jQuery.data(elem,
"handle") || jQuery.data(elem, "handle", function(){
2465                 
// Handle the second event of a trigger and when
2466                 
// an event is called after a page has unloaded
2467                 
return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2468                     jQuery.
event.handle.apply(arguments.callee.elem, arguments) :
2469                     undefined;
2470             });
2471         
// Add elem as a property of the handle function
2472         
// This is to prevent a memory leak with non-native
2473         
// event in IE.
2474         handle.elem = elem;
2475
2476         
// Handle multiple events separated by a space
2477         
// jQuery(...).bind("mouseover mouseout", fn);
2478         jQuery.each(types.split(/\s+/), function(index, type) {
2479             
// Namespaced event handlers
2480             
var namespaces = type.split(".");
2481             type = namespaces.shift();
2482             handler.type = namespaces.slice().sort().
join(".");
2483
2484             
// Get the current list of functions bound to this event
2485             
var handlers = events[type];
2486             
2487             
if ( jQuery.event.specialAll[type] )
2488                 jQuery.
event.specialAll[type].setup.call(elem, data, namespaces);
2489
2490             
// Init the event handler queue
2491             
if (!handlers) {
2492                 handlers = events[type] = {};
2493
2494                 
// Check for a special event handler
2495                 
// Only use addEventListener/attachEvent if the special
2496                 
// events handler returns false
2497                 
if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
2498                     
// Bind the global event handler to the element
2499                     
if (elem.addEventListener)
2500                         elem.addEventListener(type, handle,
false);
2501                     
else if (elem.attachEvent)
2502                         elem.attachEvent(
"on" + type, handle);
2503                 }
2504             }
2505
2506             
// Add the function to the element's handler list
2507             handlers[handler.guid] = handler;
2508
2509             
// Keep track of which events have been used, for global triggering
2510             jQuery.
event.global[type] = true;
2511         });
2512
2513         
// Nullify elem to prevent memory leaks in IE
2514         elem =
null;
2515     },
2516
2517     guid:
1,
2518     
global: {},
2519
2520     
// Detach an event or set of events from an element
2521     
remove: function(elem, types, handler) {
2522         
// don't do events on text and comment nodes
2523         
if ( elem.nodeType == 3 || elem.nodeType == 8 )
2524             
return;
2525
2526         
var events = jQuery.data(elem, "events"), ret, index;
2527
2528         
if ( events ) {
2529             
// Unbind all events for the element
2530             
if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
2531                 
for ( var type in events )
2532                     
this.remove( elem, type + (types || "") );
2533             
else {
2534                 
// types is actually an event object here
2535                 
if ( types.type ) {
2536                     handler = types.handler;
2537                     types = types.type;
2538                 }
2539
2540                 
// Handle multiple events seperated by a space
2541                 
// jQuery(...).unbind("mouseover mouseout", fn);
2542                 jQuery.each(types.split(/\s+/), function(index, type){
2543                     
// Namespaced event handlers
2544                     
var namespaces = type.split(".");
2545                     type = namespaces.shift();
2546                     
var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2547
2548                     
if ( events[type] ) {
2549                         
// remove the given handler for the given type
2550                         
if ( handler )
2551                             delete events[type][handler.guid];
2552
2553                         
// remove all handlers for the given type
2554                         
else
2555                             
for ( var handle in events[type] )
2556                                 
// Handle the removal of namespaced events
2557                                 
if ( namespace.test(events[type][handle].type) )
2558                                     delete events[type][handle];
2559                                     
2560                         
if ( jQuery.event.specialAll[type] )
2561                             jQuery.
event.specialAll[type].teardown.call(elem, namespaces);
2562
2563                         
// remove generic event handler if no more handlers exist
2564                         
for ( ret in events[type] ) break;
2565                         
if ( !ret ) {
2566                             
if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
2567                                 
if (elem.removeEventListener)
2568                                     elem.removeEventListener(type, jQuery.data(elem,
"handle"), false);
2569                                 
else if (elem.detachEvent)
2570                                     elem.detachEvent(
"on" + type, jQuery.data(elem, "handle"));
2571                             }
2572                             ret =
null;
2573                             delete events[type];
2574                         }
2575                     }
2576                 });
2577             }
2578
2579             
// Remove the expando if it's no longer used
2580             
for ( ret in events ) break;
2581             
if ( !ret ) {
2582                 
var handle = jQuery.data( elem, "handle" );
2583                 
if ( handle ) handle.elem = null;
2584                 jQuery.removeData( elem,
"events" );
2585                 jQuery.removeData( elem,
"handle" );
2586             }
2587         }
2588     },
2589
2590     
// bubbling is internal
2591     trigger: function(
event, data, elem, bubbling ) {
2592         
// Event object or event type
2593         
var type = event.type || event;
2594
2595         
if( !bubbling ){
2596             
event = typeof event === "object" ?
2597                 
// jQuery.Event object
2598                 
event[expando] ? event :
2599                 
// Object literal
2600                 jQuery.extend( jQuery.Event(type),
event ) :
2601                 
// Just the event type (string)
2602                 jQuery.Event(type);
2603
2604             
if ( type.indexOf("!") >= 0 ) {
2605                 
event.type = type = type.slice(0, -1);
2606                 
event.exclusive = true;
2607             }
2608
2609             
// Handle a global trigger
2610             
if ( !elem ) {
2611                 
// Don't bubble custom events when global (to avoid too much overhead)
2612                 
event.stopPropagation();
2613                 
// Only trigger if we've ever bound an event for it
2614                 
if ( this.global[type] )
2615                     jQuery.each( jQuery.cache, function(){
2616                         
if ( this.events && this.events[type] )
2617                             jQuery.
event.trigger( event, data, this.handle.elem );
2618                     });
2619             }
2620
2621             
// Handle triggering a single element
2622
2623             
// don't do events on text and comment nodes
2624             
if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
2625                 
return undefined;
2626             
2627             
// Clean up in case it is reused
2628             
event.result = undefined;
2629             
event.target = elem;
2630             
2631             
// Clone the incoming data, if any
2632             data = jQuery.makeArray(data);
2633             data.unshift(
event );
2634         }
2635
2636         
event.currentTarget = elem;
2637
2638         
// Trigger the event, it is assumed that "handle" is a function
2639         
var handle = jQuery.data(elem, "handle");
2640         
if ( handle )
2641             handle.apply( elem, data );
2642
2643         
// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
2644         
if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
2645             
event.result = false;
2646
2647         
// Trigger the native events (except for clicks on links)
2648         
if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
2649             
this.triggered = true;
2650             
try {
2651                 elem[ type ]();
2652             
// prevent IE from throwing an error for some hidden elements
2653             }
catch (e) {}
2654         }
2655
2656         
this.triggered = false;
2657
2658         
if ( !event.isPropagationStopped() ) {
2659             
var parent = elem.parentNode || elem.ownerDocument;
2660             
if ( parent )
2661                 jQuery.
event.trigger(event, data, parent, true);
2662         }
2663     },
2664
2665     handle: function(
event) {
2666         
// returned undefined or false
2667         
var all, handlers;
2668
2669         
event = arguments[0] = jQuery.event.fix( event || window.event );
2670         
event.currentTarget = this;
2671         
2672         
// Namespaced event handlers
2673         
var namespaces = event.type.split(".");
2674         
event.type = namespaces.shift();
2675
2676         
// Cache this now, all = true means, any handler
2677         all = !namespaces.length && !
event.exclusive;
2678         
2679         
var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
2680
2681         handlers = ( jQuery.data(
this, "events") || {} )[event.type];
2682
2683         
for ( var j in handlers ) {
2684             
var handler = handlers[j];
2685
2686             
// Filter the functions by class
2687             
if ( all || namespace.test(handler.type) ) {
2688                 
// Pass in a reference to the handler function itself
2689                 
// So that we can later remove it
2690                 
event.handler = handler;
2691                 
event.data = handler.data;
2692
2693                 
var ret = handler.apply(this, arguments);
2694
2695                 
if( ret !== undefined ){
2696                     
event.result = ret;
2697                     
if ( ret === false ) {
2698                         
event.preventDefault();
2699                         
event.stopPropagation();
2700                     }
2701                 }
2702
2703                 
if( event.isImmediatePropagationStopped() )
2704                     
break;
2705
2706             }
2707         }
2708     },
2709
2710     props:
"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2711
2712     fix: function(
event) {
2713         
if ( event[expando] )
2714             
return event;
2715
2716         
// store a copy of the original event object
2717         
// and "clone" to set read-only properties
2718         
var originalEvent = event;
2719         
event = jQuery.Event( originalEvent );
2720
2721         
for ( var i = this.props.length, prop; i; ){
2722             prop =
this.props[ --i ];
2723             
event[ prop ] = originalEvent[ prop ];
2724         }
2725
2726         
// Fix target property, if necessary
2727         
if ( !event.target )
2728             
event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
2729
2730         
// check if target is a textnode (safari)
2731         
if ( event.target.nodeType == 3 )
2732             
event.target = event.target.parentNode;
2733
2734         
// Add relatedTarget, if necessary
2735         
if ( !event.relatedTarget && event.fromElement )
2736             
event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
2737
2738         
// Calculate pageX/Y if missing and clientX/Y available
2739         
if ( event.pageX == null && event.clientX != null ) {
2740             
var doc = document.documentElement, body = document.body;
2741             
event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
2742             
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
2743         }
2744
2745         
// Add which for key events
2746         
if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
2747             
event.which = event.charCode || event.keyCode;
2748
2749         
// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2750         
if ( !event.metaKey && event.ctrlKey )
2751             
event.metaKey = event.ctrlKey;
2752
2753         
// Add which for click: 1 == left; 2 == middle; 3 == right
2754         
// Note: button is not normalized, so don't use it
2755         
if ( !event.which && event.button )
2756             
event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2757
2758         
return event;
2759     },
2760
2761     proxy: function( fn, proxy ){
2762         proxy = proxy || function(){
return fn.apply(this, arguments); };
2763         
// Set the guid of unique handler to the same of original handler, so it can be removed
2764         proxy.guid = fn.guid = fn.guid || proxy.guid ||
this.guid++;
2765         
// So proxy can be declared as an argument
2766         
return proxy;
2767     },
2768
2769     special: {
2770         ready: {
2771             
// Make sure the ready event is setup
2772             setup: bindReady,
2773             teardown: function() {}
2774         }
2775     },
2776     
2777     specialAll: {
2778         live: {
2779             setup: function( selector, namespaces ){
2780                 jQuery.
event.add( this, namespaces[0], liveHandler );
2781             },
2782             teardown: function( namespaces ){
2783                 
if ( namespaces.length ) {
2784                     
var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
2785                     
2786                     jQuery.each( (jQuery.data(
this, "events").live || {}), function(){
2787                         
if ( name.test(this.type) )
2788                             
remove++;
2789                     });
2790                     
2791                     
if ( remove < 1 )
2792                         jQuery.
event.remove( this, namespaces[0], liveHandler );
2793                 }
2794             }
2795         }
2796     }
2797 };
2798
2799 jQuery.Event = function( src ){
2800     
// Allow instantiation without the 'new' keyword
2801     
if( !this.preventDefault )
2802         
return new jQuery.Event(src);
2803     
2804     
// Event object
2805     
if( src && src.type ){
2806         
this.originalEvent = src;
2807         
this.type = src.type;
2808     
// Event type
2809     }
else
2810         
this.type = src;
2811
2812     
// timeStamp is buggy for some events on Firefox(#3843)
2813     
// So we won't rely on the native value
2814     
this.timeStamp = now();
2815     
2816     
// Mark it as fixed
2817     
this[expando] = true;
2818 };
2819
2820 function returnFalse(){
2821     
return false;
2822 }
2823 function returnTrue(){
2824     
return true;
2825 }

2826
2827 // jQuery.Event
is based on DOM3 Events as specified by the ECMAScript Language Binding
2828 // http://www.w3.org/TR/
2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2829 jQuery.Event.prototype = {
2830     preventDefault: function() {
2831         
this.isDefaultPrevented = returnTrue;
2832
2833         
var e = this.originalEvent;
2834         
if( !e )
2835             
return;
2836         
// if preventDefault exists run it on the original event
2837         
if (e.preventDefault)
2838             e.preventDefault();
2839         
// otherwise set the returnValue property of the original event to false (IE)
2840         e.returnValue =
false;
2841     },
2842     stopPropagation: function() {
2843         
this.isPropagationStopped = returnTrue;
2844
2845         
var e = this.originalEvent;
2846         
if( !e )
2847             
return;
2848         
// if stopPropagation exists run it on the original event
2849         
if (e.stopPropagation)
2850             e.stopPropagation();
2851         
// otherwise set the cancelBubble property of the original event to true (IE)
2852         e.cancelBubble =
true;
2853     },
2854     stopImmediatePropagation:function(){
2855         
this.isImmediatePropagationStopped = returnTrue;
2856         
this.stopPropagation();
2857     },
2858     isDefaultPrevented: returnFalse,
2859     isPropagationStopped: returnFalse,
2860     isImmediatePropagationStopped: returnFalse
2861 };

2862 // Checks
if an event happened on an element within another element
2863 // Used
in jQuery.event.special.mouseenter and mouseleave handlers
2864 var
withinElement = function(event) {
2865     
// Check if mouse(over|out) are still within the same parent element
2866     
var parent = event.relatedTarget;
2867     
// Traverse up the tree
2868     
while ( parent && parent != this )
2869         
try { parent = parent.parentNode; }
2870         
catch(e) { parent = this; }
2871     
2872     
if( parent != this ){
2873         
// set the correct event type
2874         
event.type = event.data;
2875         
// handle event if we actually just moused on to a non sub-element
2876         jQuery.
event.handle.apply( this, arguments );
2877     }
2878 };
2879     
2880 jQuery.each({
2881     mouseover:
'mouseenter',
2882     mouseout:
'mouseleave'
2883 }, function( orig, fix ){
2884     jQuery.
event.special[ fix ] = {
2885         setup: function(){
2886             jQuery.
event.add( this, orig, withinElement, fix );
2887         },
2888         teardown: function(){
2889             jQuery.
event.remove( this, orig, withinElement );
2890         }
2891     };
2892 });
2893
2894 jQuery.fn.extend({
2895     bind: function( type, data, fn ) {
2896         
return type == "unload" ? this.one(type, data, fn) : this.each(function(){
2897             jQuery.
event.add( this, type, fn || data, fn && data );
2898         });
2899     },
2900
2901     one: function( type, data, fn ) {
2902         
var one = jQuery.event.proxy( fn || data, function(event) {
2903             jQuery(
this).unbind(event, one);
2904             
return (fn || data).apply( this, arguments );
2905         });
2906         
return this.each(function(){
2907             jQuery.
event.add( this, type, one, fn && data);
2908         });
2909     },
2910
2911     unbind: function( type, fn ) {
2912         
return this.each(function(){
2913             jQuery.
event.remove( this, type, fn );
2914         });
2915     },
2916
2917     trigger: function( type, data ) {
2918         
return this.each(function(){
2919             jQuery.
event.trigger( type, data, this );
2920         });
2921     },
2922
2923     triggerHandler: function( type, data ) {
2924         
if( this[0] ){
2925             
var event = jQuery.Event(type);
2926             
event.preventDefault();
2927             
event.stopPropagation();
2928             jQuery.
event.trigger( event, data, this[0] );
2929             
return event.result;
2930         }
2931     },
2932
2933     toggle: function( fn ) {
2934         
// Save reference to arguments for access in closure
2935         
var args = arguments, i = 1;
2936
2937         
// link all the functions, so any of them can unbind this click handler
2938         
while( i < args.length )
2939             jQuery.
event.proxy( fn, args[i++] );
2940
2941         
return this.click( jQuery.event.proxy( fn, function(event) {
2942             
// Figure out which function to execute
2943             
this.lastToggle = ( this.lastToggle || 0 ) % i;
2944
2945             
// Make sure that clicks stop
2946             
event.preventDefault();
2947
2948             
// and execute the function
2949             
return args[ this.lastToggle++ ].apply( this, arguments ) || false;
2950         }));
2951     },
2952
2953     hover: function(fnOver, fnOut) {
2954         
return this.mouseenter(fnOver).mouseleave(fnOut);
2955     },
2956
2957     ready: function(fn) {
2958         
// Attach the listeners
2959         bindReady();
2960
2961         
// If the DOM is already ready
2962         
if ( jQuery.isReady )
2963             
// Execute the function immediately
2964             fn.call( document, jQuery );
2965
2966         
// Otherwise, remember the function for later
2967         
else
2968             
// Add the function to the wait list
2969             jQuery.readyList.push( fn );
2970
2971         
return this;
2972     },
2973     
2974     live: function( type, fn ){
2975         
var proxy = jQuery.event.proxy( fn );
2976         proxy.guid +=
this.selector + type;
2977
2978         jQuery(document).bind( liveConvert(type,
this.selector), this.selector, proxy );
2979
2980         
return this;
2981     },
2982     
2983     die: function( type, fn ){
2984         jQuery(document).unbind( liveConvert(type,
this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
2985         
return this;
2986     }
2987 });
2988
2989 function liveHandler(
event ){
2990     
var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
2991         stop =
true,
2992         elems = [];
2993
2994     jQuery.each(jQuery.data(
this, "events").live || [], function(i, fn){
2995         
if ( check.test(fn.type) ) {
2996             
var elem = jQuery(event.target).closest(fn.data)[0];
2997             
if ( elem )
2998                 elems.push({ elem: elem, fn: fn });
2999         }
3000     });
3001
3002     elems.sort(function(a,b) {
3003         
return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
3004     });
3005     
3006     jQuery.each(elems, function(){
3007         
if ( this.fn.call(this.elem, event, this.fn.data) === false )
3008             
return (stop = false);
3009     });
3010
3011     
return stop;
3012 }
3013
3014 function liveConvert(type, selector){
3015     
return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
3016 }
3017
3018 jQuery.extend({
3019     isReady:
false,
3020     readyList: [],
3021     
// Handle when the DOM is ready
3022     ready: function() {
3023         
// Make sure that the DOM is not already loaded
3024         
if ( !jQuery.isReady ) {
3025             
// Remember that the DOM is ready
3026             jQuery.isReady =
true;
3027
3028             
// If there are functions bound, to execute
3029             
if ( jQuery.readyList ) {
3030                 
// Execute all of them
3031                 jQuery.each( jQuery.readyList, function(){
3032                     
this.call( document, jQuery );
3033                 });
3034
3035                 
// Reset the list of functions
3036                 jQuery.readyList =
null;
3037             }
3038
3039             
// Trigger any bound ready events
3040             jQuery(document).triggerHandler(
"ready");
3041         }
3042     }
3043 });

3044
3045 var
readyBound = false;
3046
3047 function bindReady(){
3048     
if ( readyBound ) return;
3049     readyBound =
true;
3050
3051     
// Mozilla, Opera and webkit nightlies currently support this event
3052     
if ( document.addEventListener ) {
3053         
// Use the handy event callback
3054         document.addEventListener(
"DOMContentLoaded", function(){
3055             document.removeEventListener(
"DOMContentLoaded", arguments.callee, false );
3056             jQuery.ready();
3057         },
false );
3058
3059     
// If IE event model is used
3060     }
else if ( document.attachEvent ) {
3061         
// ensure firing before onload,
3062         
// maybe late but safe also for iframes
3063         document.attachEvent(
"onreadystatechange", function(){
3064             
if ( document.readyState === "complete" ) {
3065                 document.detachEvent(
"onreadystatechange", arguments.callee );
3066                 jQuery.ready();
3067             }
3068         });
3069
3070         
// If IE and not an iframe
3071         
// continually check to see if the document is ready
3072         
if ( document.documentElement.doScroll && window == window.top ) (function(){
3073             
if ( jQuery.isReady ) return;
3074
3075             
try {
3076                 
// If IE is used, use the trick by Diego Perini
3077                 
// http://javascript.nwbox.com/IEContentLoaded/
3078                 document.documentElement.doScroll(
"left");
3079             }
catch( error ) {
3080                 setTimeout( arguments.callee,
0 );
3081                 
return;
3082             }
3083
3084             
// and execute any waiting functions
3085             jQuery.ready();
3086         })();
3087     }
3088
3089     
// A fallback to window.onload, that will always work
3090     jQuery.
event.add( window, "load", jQuery.ready );
3091 }
3092
3093 jQuery.each( (
"blur,focus,load,resize,scroll,unload,click,dblclick," +
3094     
"mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
3095     
"change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
3096
3097     
// Handle event binding
3098     jQuery.fn[name] = function(fn){
3099         
return fn ? this.bind(name, fn) : this.trigger(name);
3100     };
3101 });

3102
3103 // Prevent memory leaks
in IE
3104 // And prevent errors
on refresh with events like mouseover in other browsers
3105 // Window isn
't included so as not to unbind existing unload events
3106 jQuery( window ).bind(
'unload', function(){
3107     
for ( var id in jQuery.cache )
3108         
// Skip the window
3109         
if ( id != 1 && jQuery.cache[ id ].handle )
3110             jQuery.
event.remove( jQuery.cache[ id ].handle.elem );
3111 });
3112 (function(){
3113
3114     jQuery.support = {};
3115
3116     
var root = document.documentElement,
3117         script = document.createElement(
"script"),
3118         div = document.createElement(
"div"),
3119         id =
"script" + (new Date).getTime();
3120
3121     div.style.display =
"none";
3122     div.innerHTML =
' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
3123
3124     
var all = div.getElementsByTagName("*"),
3125         a = div.getElementsByTagName(
"a")[0];
3126
3127     
// Can't get basic test support
3128     
if ( !all || !all.length || !a ) {
3129         
return;
3130     }
3131
3132     jQuery.support = {
3133         
// IE strips leading whitespace when .innerHTML is used
3134         leadingWhitespace: div.firstChild.nodeType ==
3,
3135         
3136         
// Make sure that tbody elements aren't automatically inserted
3137         
// IE will insert them into empty tables
3138         tbody: !div.getElementsByTagName(
"tbody").length,
3139         
3140         
// Make sure that you can get all elements in an <object> element
3141         
// IE 7 always returns no results
3142         objectAll: !!div.getElementsByTagName(
"object")[0]
3143             .getElementsByTagName(
"*").length,
3144         
3145         
// Make sure that link elements get serialized correctly by innerHTML
3146         
// This requires a wrapper element in IE
3147         htmlSerialize: !!div.getElementsByTagName(
"link").length,
3148         
3149         
// Get the style information from getAttribute
3150         
// (IE uses .cssText insted)
3151         style: /red/.test( a.getAttribute(
"style") ),
3152         
3153         
// Make sure that URLs aren't manipulated
3154         
// (IE normalizes it by default)
3155         hrefNormalized: a.getAttribute(
"href") === "/a",
3156         
3157         
// Make sure that element opacity exists
3158         
// (IE uses filter instead)
3159         opacity: a.style.opacity ===
"0.5",
3160         
3161         
// Verify style float existence
3162         
// (IE uses styleFloat instead of cssFloat)
3163         cssFloat: !!a.style.cssFloat,
3164
3165         
// Will be defined later
3166         scriptEval:
false,
3167         noCloneEvent:
true,
3168         boxModel:
null
3169     };
3170     
3171     script.type =
"text/javascript";
3172     
try {
3173         script.appendChild( document.createTextNode(
"window." + id + "=1;" ) );
3174     }
catch(e){}
3175
3176     root.insertBefore( script, root.firstChild );
3177     
3178     
// Make sure that the execution of code works by injecting a script
3179     
// tag with appendChild/createTextNode
3180     
// (IE doesn't support this, fails, and uses .text instead)
3181     
if ( window[ id ] ) {
3182         jQuery.support.scriptEval =
true;
3183         delete window[ id ];
3184     }
3185
3186     root.removeChild( script );
3187
3188     
if ( div.attachEvent && div.fireEvent ) {
3189         div.attachEvent(
"onclick", function(){
3190             
// Cloning a node shouldn't copy over any
3191             
// bound event handlers (IE does this)
3192             jQuery.support.noCloneEvent =
false;
3193             div.detachEvent(
"onclick", arguments.callee);
3194         });
3195         div.cloneNode(
true).fireEvent("onclick");
3196     }
3197
3198     
// Figure out if the W3C box model works as expected
3199     
// document.body must exist before we can do this
3200     jQuery(function(){
3201         
var div = document.createElement("div");
3202         div.style.width = div.style.paddingLeft =
"1px";
3203
3204         document.body.appendChild( div );
3205         jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth ===
2;
3206         document.body.removeChild( div ).style.display =
'none';
3207     });
3208 })();

3209
3210 var
styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
3211
3212 jQuery.props = {
3213     
"for": "htmlFor",
3214     
"class": "className",
3215     
"float": styleFloat,
3216     cssFloat: styleFloat,
3217     styleFloat: styleFloat,
3218     
readonly: "readOnly",
3219     maxlength:
"maxLength",
3220     cellspacing:
"cellSpacing",
3221     rowspan:
"rowSpan",
3222     tabindex:
"tabIndex"
3223 };
3224 jQuery.fn.extend({
3225     
// Keep a copy of the old load
3226     _load: jQuery.fn.load,
3227
3228     load: function( url,
params, callback ) {
3229         
if ( typeof url !== "string" )
3230             
return this._load( url );
3231
3232         
var off = url.indexOf(" ");
3233         
if ( off >= 0 ) {
3234             
var selector = url.slice(off, url.length);
3235             url = url.slice(
0, off);
3236         }
3237
3238         
// Default to a GET request
3239         
var type = "GET";
3240
3241         
// If the second parameter was provided
3242         
if ( params )
3243             
// If it's a function
3244             
if ( jQuery.isFunction( params ) ) {
3245                 
// We assume that it's the callback
3246                 callback =
params;
3247                 
params = null;
3248
3249             
// Otherwise, build a param string
3250             }
else if( typeof params === "object" ) {
3251                 
params = jQuery.param( params );
3252                 type =
"POST";
3253             }
3254
3255         
var self = this;
3256
3257         
// Request the remote document
3258         jQuery.ajax({
3259             url: url,
3260             type: type,
3261             dataType:
"html",
3262             data:
params,
3263             complete: function(res, status){
3264                 
// If successful, inject the HTML into all the matched elements
3265                 
if ( status == "success" || status == "notmodified" )
3266                     
// See if a selector was specified
3267                     self.html( selector ?
3268                         
// Create a dummy div to hold the results
3269                         jQuery(
"<div/>")
3270                             
// inject the contents of the document in, removing the scripts
3271                             
// to avoid any 'Permission Denied' errors in IE
3272                             .append(res.responseText.replace(/<script(.|\s)*?\/script>/g,
""))
3273
3274                             
// Locate the specified elements
3275                             .find(selector) :
3276
3277                         
// If not, just inject the full result
3278                         res.responseText );
3279
3280                 
if( callback )
3281                     self.each( callback, [res.responseText, status, res] );
3282             }
3283         });
3284         
return this;
3285     },
3286
3287     serialize: function() {
3288         
return jQuery.param(this.serializeArray());
3289     },
3290     serializeArray: function() {
3291         
return this.map(function(){
3292             
return this.elements ? jQuery.makeArray(this.elements) : this;
3293         })
3294         .filter(function(){
3295             
return this.name && !this.disabled &&
3296                 (
this.checked || /select|textarea/i.test(this.nodeName) ||
3297                     /text|hidden|password|search/i.test(
this.type));
3298         })
3299         .map(function(i, elem){
3300             
var val = jQuery(this).val();
3301             
return val == null ? null :
3302                 jQuery.isArray(val) ?
3303                     jQuery.map( val, function(val, i){
3304                         
return {name: elem.name, value: val};
3305                     }) :
3306                     {name: elem.name,
value: val};
3307         }).
get();
3308     }
3309 });

3310
3311 // Attach a bunch of functions
for handling common AJAX events
3312 jQuery.each(
"ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
3313     jQuery.fn[o] = function(f){
3314         
return this.bind(o, f);
3315     };
3316 });

3317
3318 var
jsc = now();
3319
3320 jQuery.extend({
3321   
3322     
get: function( url, data, callback, type ) {
3323         
// shift arguments if data argument was ommited
3324         
if ( jQuery.isFunction( data ) ) {
3325             callback = data;
3326             data =
null;
3327         }
3328
3329         
return jQuery.ajax({
3330             type:
"GET",
3331             url: url,
3332             data: data,
3333             success: callback,
3334             dataType: type
3335         });
3336     },
3337
3338     getScript: function( url, callback ) {
3339         
return jQuery.get(url, null, callback, "script");
3340     },
3341
3342     getJSON: function( url, data, callback ) {
3343         
return jQuery.get(url, data, callback, "json");
3344     },
3345
3346     post: function( url, data, callback, type ) {
3347         
if ( jQuery.isFunction( data ) ) {
3348             callback = data;
3349             data = {};
3350         }
3351
3352         
return jQuery.ajax({
3353             type:
"POST",
3354             url: url,
3355             data: data,
3356             success: callback,
3357             dataType: type
3358         });
3359     },
3360
3361     ajaxSetup: function( settings ) {
3362         jQuery.extend( jQuery.ajaxSettings, settings );
3363     },
3364
3365     ajaxSettings: {
3366         url: location.href,
3367         
global: true,
3368         type:
"GET",
3369         contentType:
"application/x-www-form-urlencoded",
3370         processData:
true,
3371         
async: true,
3372         
/*
3373         timeout:
0,
3374         data:
null,
3375         username:
null,
3376         password:
null,
3377         */

3378         
// Create the request object; Microsoft failed to properly
3379         
// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
3380         
// This function can be overriden by calling jQuery.ajaxSetup
3381         xhr:function(){
3382             
return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
3383         },
3384         accepts: {
3385             xml:
"application/xml, text/xml",
3386             html:
"text/html",
3387             script:
"text/javascript, application/javascript",
3388             json:
"application/json, text/javascript",
3389             text:
"text/plain",
3390             _default:
"*/*"
3391         }
3392     },
3393
3394     // Last-Modified header cache
for next request
3395     lastModified: {},
3396
3397     ajax: function( s ) {
3398         // Extend the settings, but re-extend
's' so that it can be
3399         //
checked again later (in the test suite, specifically)
3400         s = jQuery.extend(
true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
3401
3402         
var jsonp, jsre = /=\?(&|$)/g, status, data,
3403             type = s.type.toUpperCase();
3404
3405         // convert data
if not already a string
3406         
if ( s.data && s.processData && typeof s.data !== "string" )
3407             s.data = jQuery.param(s.data);
3408
3409         // Handle JSONP Parameter Callbacks
3410         
if ( s.dataType == "jsonp" ) {
3411             
if ( type == "GET" ) {
3412                 
if ( !s.url.match(jsre) )
3413                     s.url += (s.url.match(/\?/) ?
"&" : "?") + (s.jsonp || "callback") + "=?";
3414             }
else if ( !s.data || !s.data.match(jsre) )
3415                 s.data = (s.data ? s.data +
"&" : "") + (s.jsonp || "callback") + "=?";
3416             s.dataType =
"json";
3417         }
3418
3419         // Build temporary JSONP function
3420         
if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
3421             jsonp =
"jsonp" + jsc++;
3422
3423             // Replace the =? sequence both
in the query string and the data
3424             
if ( s.data )
3425                 s.data = (s.data +
"").replace(jsre, "=" + jsonp + "$1");
3426             s.url = s.url.replace(jsre,
"=" + jsonp + "$1");
3427
3428             // We need to make sure
3429             // that a JSONP style response
is executed properly
3430             s.dataType =
"script";
3431
3432             // Handle JSONP-style loading
3433             window[ jsonp ] = function(tmp){
3434                 data = tmp;
3435                 success();
3436                 complete();
3437                 // Garbage collect
3438                 window[ jsonp ] = undefined;
3439                 
try{ delete window[ jsonp ]; } catch(e){}
3440                 
if ( head )
3441                     head.removeChild( script );
3442             };
3443         }
3444
3445         
if ( s.dataType == "script" && s.cache == null )
3446             s.cache =
false;
3447
3448         
if ( s.cache === false && type == "GET" ) {
3449             
var ts = now();
3450             //
try replacing _= if it is there
3451             
var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
3452             //
if nothing was replaced, add timestamp to the end
3453             s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ?
"&" : "?") + "_=" + ts : "");
3454         }
3455
3456         // If data
is available, append data to url for get requests
3457         
if ( s.data && type == "GET" ) {
3458             s.url += (s.url.match(/\?/) ?
"&" : "?") + s.data;
3459
3460             // IE likes to send both
get and post data, prevent this
3461             s.data =
null;
3462         }
3463
3464         // Watch
for a new set of requests
3465         
if ( s.global && ! jQuery.active++ )
3466             jQuery.
event.trigger( "ajaxStart" );
3467
3468         // Matches an absolute URL, and saves the domain
3469         
var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
3470
3471         // If we
're requesting a remote document
3472         // and trying to load JSON or Script with a GET
3473         
if ( s.dataType == "script" && type == "GET" && parts
3474             && ( parts[
1] && parts[1] != location.protocol || parts[2] != location.host )){
3475
3476             
var head = document.getElementsByTagName("head")[0];
3477             
var script = document.createElement("script");
3478             script.src = s.url;
3479             
if (s.scriptCharset)
3480                 script.charset = s.scriptCharset;
3481
3482             // Handle Script loading
3483             
if ( !jsonp ) {
3484                 
var done = false;
3485
3486                 // Attach handlers
for all browsers
3487                 script.onload = script.onreadystatechange = function(){
3488                     
if ( !done && (!this.readyState ||
3489                             
this.readyState == "loaded" || this.readyState == "complete") ) {
3490                         done =
true;
3491                         success();
3492                         complete();
3493
3494                         // Handle memory leak
in IE
3495                         script.onload = script.onreadystatechange =
null;
3496                         head.removeChild( script );
3497                     }
3498                 };
3499             }
3500
3501             head.appendChild(script);
3502
3503             // We handle everything
using the script element injection
3504             
return undefined;
3505         }
3506
3507         
var requestDone = false;
3508
3509         // Create the request
object
3510         
var xhr = s.xhr();
3511
3512         // Open the socket
3513         // Passing
null username, generates a login popup on Opera (#2865)
3514         
if( s.username )
3515             xhr.open(type, s.url, s.
async, s.username, s.password);
3516         
else
3517             xhr.open(type, s.url, s.
async);
3518
3519         // Need an extra
try/catch for cross domain requests in Firefox 3
3520         
try {
3521             // Set the correct header,
if data is being sent
3522             
if ( s.data )
3523                 xhr.setRequestHeader(
"Content-Type", s.contentType);
3524
3525             // Set the If-Modified-Since header,
if ifModified mode.
3526             
if ( s.ifModified )
3527                 xhr.setRequestHeader(
"If-Modified-Since",
3528                     jQuery.lastModified[s.url] ||
"Thu, 01 Jan 1970 00:00:00 GMT" );
3529
3530             // Set header so the called script knows that it
's an XMLHttpRequest
3531             xhr.setRequestHeader(
"X-Requested-With", "XMLHttpRequest");
3532
3533             // Set the Accepts header
for the server, depending on the dataType
3534             xhr.setRequestHeader(
"Accept", s.dataType && s.accepts[ s.dataType ] ?
3535                 s.accepts[ s.dataType ] +
", */*" :
3536                 s.accepts._default );
3537         }
catch(e){}
3538
3539         
// Allow custom headers/mimetypes and early abort
3540         
if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
3541             
// Handle the global AJAX counter
3542             
if ( s.global && ! --jQuery.active )
3543                 jQuery.
event.trigger( "ajaxStop" );
3544             
// close opended socket
3545             xhr.abort();
3546             
return false;
3547         }
3548
3549         
if ( s.global )
3550             jQuery.
event.trigger("ajaxSend", [xhr, s]);
3551
3552         
// Wait for a response to come back
3553         
var onreadystatechange = function(isTimeout){
3554             
// The request was aborted, clear the interval and decrement jQuery.active
3555             
if (xhr.readyState == 0) {
3556                 
if (ival) {
3557                     
// clear poll interval
3558                     clearInterval(ival);
3559                     ival =
null;
3560                     
// Handle the global AJAX counter
3561                     
if ( s.global && ! --jQuery.active )
3562                         jQuery.
event.trigger( "ajaxStop" );
3563                 }
3564             
// The transfer is complete and the data is available, or the request timed out
3565             }
else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
3566                 requestDone =
true;
3567
3568                 
// clear poll interval
3569                 
if (ival) {
3570                     clearInterval(ival);
3571                     ival =
null;
3572                 }
3573
3574                 status = isTimeout ==
"timeout" ? "timeout" :
3575                     !jQuery.httpSuccess( xhr ) ?
"error" :
3576                     s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
"notmodified" :
3577                     
"success";
3578
3579                 
if ( status == "success" ) {
3580                     
// Watch for, and catch, XML document parse errors
3581                     
try {
3582                         
// process the data (runs the xml through httpData regardless of callback)
3583                         data = jQuery.httpData( xhr, s.dataType, s );
3584                     }
catch(e) {
3585                         status =
"parsererror";
3586                     }
3587                 }
3588
3589                 
// Make sure that the request was successful or notmodified
3590                 
if ( status == "success" ) {
3591                     
// Cache Last-Modified header, if ifModified mode.
3592                     
var modRes;
3593                     
try {
3594                         modRes = xhr.getResponseHeader(
"Last-Modified");
3595                     }
catch(e) {} // swallow exception thrown by FF if header is not available
3596
3597                     
if ( s.ifModified && modRes )
3598                         jQuery.lastModified[s.url] = modRes;
3599
3600                     
// JSONP handles its own success callback
3601                     
if ( !jsonp )
3602                         success();
3603                 }
else
3604                     jQuery.handleError(s, xhr, status);
3605
3606                 
// Fire the complete handlers
3607                 complete();
3608
3609                 
if ( isTimeout )
3610                     xhr.abort();
3611
3612                 
// Stop memory leaks
3613                 
if ( s.async )
3614                     xhr =
null;
3615             }
3616         };
3617
3618         
if ( s.async ) {
3619             
// don't attach the handler to the request, just poll it instead
3620             
var ival = setInterval(onreadystatechange, 13);
3621
3622             
// Timeout checker
3623             
if ( s.timeout > 0 )
3624                 setTimeout(function(){
3625                     
// Check to see if the request is still happening
3626                     
if ( xhr && !requestDone )
3627                         onreadystatechange(
"timeout" );
3628                 }, s.timeout);
3629         }
3630
3631         
// Send the data
3632         
try {
3633             xhr.send(s.data);
3634         }
catch(e) {
3635             jQuery.handleError(s, xhr,
null, e);
3636         }
3637
3638         
// firefox 1.5 doesn't fire statechange for sync requests
3639         
if ( !s.async )
3640             onreadystatechange();
3641
3642         function success(){
3643             
// If a local callback was specified, fire it and pass it the data
3644             
if ( s.success )
3645                 s.success( data, status );
3646
3647             
// Fire the global callback
3648             
if ( s.global )
3649                 jQuery.
event.trigger( "ajaxSuccess", [xhr, s] );
3650         }
3651
3652         function complete(){
3653             
// Process result
3654             
if ( s.complete )
3655                 s.complete(xhr, status);
3656
3657             
// The request was completed
3658             
if ( s.global )
3659                 jQuery.
event.trigger( "ajaxComplete", [xhr, s] );
3660
3661             
// Handle the global AJAX counter
3662             
if ( s.global && ! --jQuery.active )
3663                 jQuery.
event.trigger( "ajaxStop" );
3664         }
3665
3666         
// return XMLHttpRequest to allow aborting the request etc.
3667         
return xhr;
3668     },
3669
3670     handleError: function( s, xhr, status, e ) {
3671         
// If a local callback was specified, fire it
3672         
if ( s.error ) s.error( xhr, status, e );
3673
3674         
// Fire the global callback
3675         
if ( s.global )
3676             jQuery.
event.trigger( "ajaxError", [xhr, s, e] );
3677     },
3678
3679     
// Counter for holding the number of active queries
3680     active:
0,
3681
3682     
// Determines if an XMLHttpRequest was successful or not
3683     httpSuccess: function( xhr ) {
3684         
try {
3685             
// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
3686             
return !xhr.status && location.protocol == "file:" ||
3687                 ( xhr.status >=
200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
3688         }
catch(e){}
3689         
return false;
3690     },
3691
3692     
// Determines if an XMLHttpRequest returns NotModified
3693     httpNotModified: function( xhr, url ) {
3694         
try {
3695             
var xhrRes = xhr.getResponseHeader("Last-Modified");
3696
3697             
// Firefox always returns 200. check Last-Modified date
3698             
return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
3699         }
catch(e){}
3700         
return false;
3701     },
3702
3703     httpData: function( xhr, type, s ) {
3704         
var ct = xhr.getResponseHeader("content-type"),
3705             xml = type ==
"xml" || !type && ct && ct.indexOf("xml") >= 0,
3706             data = xml ? xhr.responseXML : xhr.responseText;
3707
3708         
if ( xml && data.documentElement.tagName == "parsererror" )
3709             
throw "parsererror";
3710             
3711         
// Allow a pre-filtering function to sanitize the response
3712         
// s != null is checked to keep backwards compatibility
3713         
if( s && s.dataFilter )
3714             data = s.dataFilter( data, type );
3715
3716         
// The filter can actually parse the response
3717         
if( typeof data === "string" ){
3718
3719             
// If the type is "script", eval it in global context
3720             
if ( type == "script" )
3721                 jQuery.globalEval( data );
3722
3723             
// Get the JavaScript object, if JSON is used.
3724             
if ( type == "json" )
3725                 data = window[
"eval"]("(" + data + ")");
3726         }
3727         
3728         
return data;
3729     },
3730
3731     
// Serialize an array of form elements or a set of
3732     
// key/values into a query string
3733     param: function( a ) {
3734         
var s = [ ];
3735
3736         function
add( key, value ){
3737             s[ s.length ] = encodeURIComponent(key) +
'=' + encodeURIComponent(value);
3738         };
3739
3740         
// If an array was passed in, assume that it is an array
3741         
// of form elements
3742         
if ( jQuery.isArray(a) || a.jquery )
3743             
// Serialize the form elements
3744             jQuery.each( a, function(){
3745                 
add( this.name, this.value );
3746             });
3747
3748         
// Otherwise, assume that it's an object of key/value pairs
3749         
else
3750             
// Serialize the key/values
3751             
for ( var j in a )
3752                 
// If the value is an array then the key names need to be repeated
3753                 
if ( jQuery.isArray(a[j]) )
3754                     jQuery.each( a[j], function(){
3755                         
add( j, this );
3756                     });
3757                 
else
3758                     
add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
3759
3760         
// Return the resulting serialization
3761         
return s.join("&").replace(/%20/g, "+");
3762     }
3763
3764 });

3765 var
elemdisplay = {},
3766     timerId,
3767     fxAttrs = [
3768         
// height animations
3769         [
"height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
3770         
// width animations
3771         [
"width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
3772         
// opacity animations
3773         
[ "opacity" ]
3774     ];
3775
3776 function genFx( type, num ){
3777     
var obj = {};
3778     jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(
0,num)), function(){
3779         obj[
this ] = type;
3780     });
3781     
return obj;
3782 }
3783
3784 jQuery.fn.extend({
3785     show: function(speed,callback){
3786         
if ( speed ) {
3787             
return this.animate( genFx("show", 3), speed, callback);
3788         }
else {
3789             
for ( var i = 0, l = this.length; i < l; i++ ){
3790                 
var old = jQuery.data(this[i], "olddisplay");
3791                 
3792                 
this[i].style.display = old || "";
3793                 
3794                 
if ( jQuery.css(this[i], "display") === "none" ) {
3795                     
var tagName = this[i].tagName, display;
3796                     
3797                     
if ( elemdisplay[ tagName ] ) {
3798                         display = elemdisplay[ tagName ];
3799                     }
else {
3800                         
var elem = jQuery("<" + tagName + " />").appendTo("body");
3801                         
3802                         display = elem.css(
"display");
3803                         
if ( display === "none" )
3804                             display =
"block";
3805                         
3806                         elem.
remove();
3807                         
3808                         elemdisplay[ tagName ] = display;
3809                     }
3810                     
3811                     jQuery.data(
this[i], "olddisplay", display);
3812                 }
3813             }
3814
3815             
// Set the display of the elements in a second loop
3816             
// to avoid the constant reflow
3817             
for ( var i = 0, l = this.length; i < l; i++ ){
3818                 
this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
3819             }
3820             
3821             
return this;
3822         }
3823     },
3824
3825     hide: function(speed,callback){
3826         
if ( speed ) {
3827             
return this.animate( genFx("hide", 3), speed, callback);
3828         }
else {
3829             
for ( var i = 0, l = this.length; i < l; i++ ){
3830                 
var old = jQuery.data(this[i], "olddisplay");
3831                 
if ( !old && old !== "none" )
3832                     jQuery.data(
this[i], "olddisplay", jQuery.css(this[i], "display"));
3833             }
3834
3835             
// Set the display of the elements in a second loop
3836             
// to avoid the constant reflow
3837             
for ( var i = 0, l = this.length; i < l; i++ ){
3838                 
this[i].style.display = "none";
3839             }
3840
3841             
return this;
3842         }
3843     },
3844
3845     
// Save the old toggle function
3846     _toggle: jQuery.fn.toggle,
3847
3848     toggle: function( fn, fn2 ){
3849         
var bool = typeof fn === "boolean";
3850
3851         
return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
3852             
this._toggle.apply( this, arguments ) :
3853             fn ==
null || bool ?
3854                 
this.each(function(){
3855                     
var state = bool ? fn : jQuery(this).is(":hidden");
3856                     jQuery(
this)[ state ? "show" : "hide" ]();
3857                 }) :
3858                 
this.animate(genFx("toggle", 3), fn, fn2);
3859     },
3860
3861     fadeTo: function(speed,to,callback){
3862         
return this.animate({opacity: to}, speed, callback);
3863     },
3864
3865     animate: function( prop, speed, easing, callback ) {
3866         
var optall = jQuery.speed(speed, easing, callback);
3867
3868         
return this[ optall.queue === false ? "each" : "queue" ](function(){
3869         
3870             
var opt = jQuery.extend({}, optall), p,
3871                 hidden =
this.nodeType == 1 && jQuery(this).is(":hidden"),
3872                 self =
this;
3873     
3874             
for ( p in prop ) {
3875                 
if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
3876                     
return opt.complete.call(this);
3877
3878                 
if ( ( p == "height" || p == "width" ) && this.style ) {
3879                     
// Store display property
3880                     opt.display = jQuery.css(
this, "display");
3881
3882                     
// Make sure that nothing sneaks out
3883                     opt.overflow =
this.style.overflow;
3884                 }
3885             }
3886
3887             
if ( opt.overflow != null )
3888                 
this.style.overflow = "hidden";
3889
3890             opt.curAnim = jQuery.extend({}, prop);
3891
3892             jQuery.each( prop, function(name, val){
3893                 
var e = new jQuery.fx( self, opt, name );
3894
3895                 
if ( /toggle|show|hide/.test(val) )
3896                     e[ val ==
"toggle" ? hidden ? "show" : "hide" : val ]( prop );
3897                 
else {
3898                     
var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
3899                         start = e.cur(
true) || 0;
3900
3901                     
if ( parts ) {
3902                         
var end = parseFloat(parts[2]),
3903                             unit = parts[
3] || "px";
3904
3905                         
// We need to compute starting value
3906                         
if ( unit != "px" ) {
3907                             self.style[ name ] = (end ||
1) + unit;
3908                             start = ((end ||
1) / e.cur(true)) * start;
3909                             self.style[ name ] = start + unit;
3910                         }
3911
3912                         
// If a +=/-= token was provided, we're doing a relative animation
3913                         
if ( parts[1] )
3914                             end = ((parts[
1] == "-=" ? -1 : 1) * end) + start;
3915
3916                         e.custom( start, end, unit );
3917                     }
else
3918                         e.custom( start, val,
"" );
3919                 }
3920             });
3921
3922             
// For JS strict compliance
3923             
return true;
3924         });
3925     },
3926
3927     stop: function(clearQueue, gotoEnd){
3928         
var timers = jQuery.timers;
3929
3930         
if (clearQueue)
3931             
this.queue([]);
3932
3933         
this.each(function(){
3934             
// go in reverse order so anything added to the queue during the loop is ignored
3935             
for ( var i = timers.length - 1; i >= 0; i-- )
3936                 
if ( timers[i].elem == this ) {
3937                     
if (gotoEnd)
3938                         
// force the next step to be the last
3939                         timers[i](
true);
3940                     timers.splice(i,
1);
3941                 }
3942         });
3943
3944         
// start the next in the queue if the last step wasn't forced
3945         
if (!gotoEnd)
3946             
this.dequeue();
3947
3948         
return this;
3949     }
3950
3951 });

3952
3953 // Generate shortcuts
for custom animations
3954 jQuery.each({
3955     slideDown: genFx(
"show", 1),
3956     slideUp: genFx(
"hide", 1),
3957     slideToggle: genFx(
"toggle", 1),
3958     fadeIn: { opacity:
"show" },
3959     fadeOut: { opacity:
"hide" }
3960 }, function( name, props ){
3961     jQuery.fn[ name ] = function( speed, callback ){
3962         
return this.animate( props, speed, callback );
3963     };
3964 });
3965
3966 jQuery.extend({
3967
3968     speed: function(speed, easing, fn) {
3969         
var opt = typeof speed === "object" ? speed : {
3970             complete: fn || !fn && easing ||
3971                 jQuery.isFunction( speed ) && speed,
3972             duration: speed,
3973             easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
3974         };
3975
3976         opt.duration = jQuery.fx.off ?
0 : typeof opt.duration === "number" ? opt.duration :
3977             jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
3978
3979         
// Queueing
3980         opt.old = opt.complete;
3981         opt.complete = function(){
3982             
if ( opt.queue !== false )
3983                 jQuery(
this).dequeue();
3984             
if ( jQuery.isFunction( opt.old ) )
3985                 opt.old.call(
this );
3986         };
3987
3988         
return opt;
3989     },
3990
3991     easing: {
3992         linear: function( p, n, firstNum, diff ) {
3993             
return firstNum + diff * p;
3994         },
3995         swing: function( p, n, firstNum, diff ) {
3996             
return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
3997         }
3998     },
3999
4000     timers: [],
4001
4002     fx: function( elem, options, prop ){
4003         
this.options = options;
4004         
this.elem = elem;
4005         
this.prop = prop;
4006
4007         
if ( !options.orig )
4008             options.orig = {};
4009     }
4010
4011 });
4012
4013 jQuery.fx.prototype = {
4014
4015     
// Simple function for setting a style value
4016     update: function(){
4017         
if ( this.options.step )
4018             
this.options.step.call( this.elem, this.now, this );
4019
4020         (jQuery.fx.step[
this.prop] || jQuery.fx.step._default)( this );
4021
4022         
// Set display property to block for height/width animations
4023         
if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
4024             
this.elem.style.display = "block";
4025     },
4026
4027     
// Get the current size
4028     cur: function(force){
4029         
if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
4030             
return this.elem[ this.prop ];
4031
4032         
var r = parseFloat(jQuery.css(this.elem, this.prop, force));
4033         
return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
4034     },
4035
4036     
// Start an animation from one number to another
4037     custom: function(
from, to, unit){
4038         
this.startTime = now();
4039         
this.start = from;
4040         
this.end = to;
4041         
this.unit = unit || this.unit || "px";
4042         
this.now = this.start;
4043         
this.pos = this.state = 0;
4044
4045         
var self = this;
4046         function t(gotoEnd){
4047             
return self.step(gotoEnd);
4048         }
4049
4050         t.elem =
this.elem;
4051
4052         
if ( t() && jQuery.timers.push(t) && !timerId ) {
4053             timerId = setInterval(function(){
4054                 
var timers = jQuery.timers;
4055
4056                 
for ( var i = 0; i < timers.length; i++ )
4057                     
if ( !timers[i]() )
4058                         timers.splice(i--,
1);
4059
4060                 
if ( !timers.length ) {
4061                     clearInterval( timerId );
4062                     timerId = undefined;
4063                 }
4064             },
13);
4065         }
4066     },
4067
4068     
// Simple 'show' function
4069     show: function(){
4070         
// Remember where we started, so that we can go back to it later
4071         
this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4072         
this.options.show = true;
4073
4074         
// Begin the animation
4075         
// Make sure that we start at a small width/height to avoid any
4076         
// flash of content
4077         
this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
4078
4079         
// Start by showing the element
4080         jQuery(
this.elem).show();
4081     },
4082
4083     
// Simple 'hide' function
4084     hide: function(){
4085         
// Remember where we started, so that we can go back to it later
4086         
this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
4087         
this.options.hide = true;
4088
4089         
// Begin the animation
4090         
this.custom(this.cur(), 0);
4091     },
4092
4093     
// Each step of an animation
4094     step: function(gotoEnd){
4095         
var t = now();
4096
4097         
if ( gotoEnd || t >= this.options.duration + this.startTime ) {
4098             
this.now = this.end;
4099             
this.pos = this.state = 1;
4100             
this.update();
4101
4102             
this.options.curAnim[ this.prop ] = true;
4103
4104             
var done = true;
4105             
for ( var i in this.options.curAnim )
4106                 
if ( this.options.curAnim[i] !== true )
4107                     done =
false;
4108
4109             
if ( done ) {
4110                 
if ( this.options.display != null ) {
4111                     
// Reset the overflow
4112                     
this.elem.style.overflow = this.options.overflow;
4113
4114                     
// Reset the display
4115                     
this.elem.style.display = this.options.display;
4116                     
if ( jQuery.css(this.elem, "display") == "none" )
4117                         
this.elem.style.display = "block";
4118                 }
4119
4120                 
// Hide the element if the "hide" operation was done
4121                 
if ( this.options.hide )
4122                     jQuery(
this.elem).hide();
4123
4124                 
// Reset the properties, if the item has been hidden or shown
4125                 
if ( this.options.hide || this.options.show )
4126                     
for ( var p in this.options.curAnim )
4127                         jQuery.attr(
this.elem.style, p, this.options.orig[p]);
4128                     
4129                 
// Execute the complete function
4130                 
this.options.complete.call( this.elem );
4131             }
4132
4133             
return false;
4134         }
else {
4135             
var n = t - this.startTime;
4136             
this.state = n / this.options.duration;
4137
4138             
// Perform the easing function, defaults to swing
4139             
this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
4140             
this.now = this.start + ((this.end - this.start) * this.pos);
4141
4142             
// Perform the next step of the animation
4143             
this.update();
4144         }
4145
4146         
return true;
4147     }
4148
4149 };
4150
4151 jQuery.extend( jQuery.fx, {
4152     speeds:{
4153         slow:
600,
4154         fast:
200,
4155         
// Default speed
4156         _default:
400
4157     },
4158     step: {
4159
4160         opacity: function(fx){
4161             jQuery.attr(fx.elem.style,
"opacity", fx.now);
4162         },
4163
4164         _default: function(fx){
4165             
if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
4166                 fx.elem.style[ fx.prop ] = fx.now + fx.unit;
4167             
else
4168                 fx.elem[ fx.prop ] = fx.now;
4169         }
4170     }
4171 });

4172 if
( document.documentElement["getBoundingClientRect"] )
4173     jQuery.fn.offset = function() {
4174         
if ( !this[0] ) return { top: 0, left: 0 };
4175         
if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4176         
var box = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
4177             clientTop = docElem.clientTop || body.clientTop ||
0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
4178             top = box.top + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop,
4179             left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
4180         
return { top: top, left: left };
4181     };

4182 else

4183     jQuery.fn.offset = function() {
4184         
if ( !this[0] ) return { top: 0, left: 0 };
4185         
if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
4186         jQuery.offset.initialized || jQuery.offset.initialize();
4187
4188         
var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
4189             doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
4190             body = doc.body, defaultView = doc.defaultView,
4191             prevComputedStyle = defaultView.getComputedStyle(elem,
null),
4192             top = elem.offsetTop, left = elem.offsetLeft;
4193
4194         
while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
4195             computedStyle = defaultView.getComputedStyle(elem,
null);
4196             top -= elem.scrollTop, left -= elem.scrollLeft;
4197             
if ( elem === offsetParent ) {
4198                 top += elem.offsetTop, left += elem.offsetLeft;
4199                 
if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
4200                     top += parseInt( computedStyle.borderTopWidth,
10) || 0,
4201                     left += parseInt( computedStyle.borderLeftWidth,
10) || 0;
4202                 prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
4203             }
4204             
if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
4205                 top += parseInt( computedStyle.borderTopWidth,
10) || 0,
4206                 left += parseInt( computedStyle.borderLeftWidth,
10) || 0;
4207             prevComputedStyle = computedStyle;
4208         }
4209
4210         
if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
4211             top += body.offsetTop,
4212             left += body.offsetLeft;
4213
4214         
if ( prevComputedStyle.position === "fixed" )
4215             top += Math.max(docElem.scrollTop, body.scrollTop),
4216             left += Math.max(docElem.scrollLeft, body.scrollLeft);
4217
4218         
return { top: top, left: left };
4219     };
4220
4221 jQuery.offset = {
4222     initialize: function() {
4223         
if ( this.initialized ) return;
4224         
var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
4225             html =
'<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';
4226
4227         rules = { position:
'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
4228         
for ( prop in rules ) container.style[prop] = rules[prop];
4229
4230         container.innerHTML = html;
4231         body.insertBefore(container, body.firstChild);
4232         innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
4233
4234         
this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
4235         
this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
4236
4237         innerDiv.style.overflow =
'hidden', innerDiv.style.position = 'relative';
4238         
this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
4239
4240         body.style.marginTop =
'1px';
4241         
this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
4242         body.style.marginTop = bodyMarginTop;
4243
4244         body.removeChild(container);
4245         
this.initialized = true;
4246     },
4247
4248     bodyOffset: function(body) {
4249         jQuery.offset.initialized || jQuery.offset.initialize();
4250         
var top = body.offsetTop, left = body.offsetLeft;
4251         
if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
4252             top += parseInt( jQuery.curCSS(body,
'marginTop', true), 10 ) || 0,
4253             left += parseInt( jQuery.curCSS(body,
'marginLeft', true), 10 ) || 0;
4254         
return { top: top, left: left };
4255     }
4256 };
4257
4258
4259 jQuery.fn.extend({
4260     position: function() {
4261         
var left = 0, top = 0, results;
4262
4263         
if ( this[0] ) {
4264             
// Get *real* offsetParent
4265             
var offsetParent = this.offsetParent(),
4266
4267             
// Get correct offsets
4268             offset =
this.offset(),
4269             parentOffset = /^body|html$/i.test(offsetParent[
0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
4270
4271             
// Subtract element margins
4272             
// note: when an element has margin: auto the offsetLeft and marginLeft
4273             
// are the same in Safari causing offset.left to incorrectly be 0
4274             offset.top -= num(
this, 'marginTop' );
4275             offset.left -= num(
this, 'marginLeft' );
4276
4277             
// Add offsetParent borders
4278             parentOffset.top += num( offsetParent,
'borderTopWidth' );
4279             parentOffset.left += num( offsetParent,
'borderLeftWidth' );
4280
4281             
// Subtract the two offsets
4282             results = {
4283                 top: offset.top - parentOffset.top,
4284                 left: offset.left - parentOffset.left
4285             };
4286         }
4287
4288         
return results;
4289     },
4290
4291     offsetParent: function() {
4292         
var offsetParent = this[0].offsetParent || document.body;
4293         
while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
4294             offsetParent = offsetParent.offsetParent;
4295         
return jQuery(offsetParent);
4296     }
4297 });

4298
4299
4300 // Create scrollLeft and scrollTop methods

4301 jQuery.each( [
'Left', 'Top'], function(i, name) {
4302     
var method = 'scroll' + name;
4303     
4304     jQuery.fn[ method ] = function(val) {
4305         
if (!this[0]) return null;
4306
4307         
return val !== undefined ?
4308
4309             
// Set the scroll offset
4310             
this.each(function() {
4311                 
this == window || this == document ?
4312                     window.scrollTo(
4313                         !i ? val : jQuery(window).scrollLeft(),
4314                          i ? val : jQuery(window).scrollTop()
4315                     ) :
4316                     
this[ method ] = val;
4317             }) :
4318
4319             
// Return the scroll offset
4320             
this[0] == window || this[0] == document ?
4321                 self[ i ?
'pageYOffset' : 'pageXOffset' ] ||
4322                     jQuery.boxModel && document.documentElement[ method ] ||
4323                     document.body[ method ] :
4324                 
this[0][ method ];
4325     };
4326 });

4327 // Create innerHeight, innerWidth, outerHeight and outerWidth methods

4328 jQuery.each([
"Height", "Width" ], function(i, name){
4329
4330     
var tl = i ? "Left" : "Top", // top or left
4331         br = i ?
"Right" : "Bottom", // bottom or right
4332         lower = name.toLowerCase();
4333
4334     
// innerHeight and innerWidth
4335     jQuery.fn[
"inner" + name] = function(){
4336         
return this[0] ?
4337             jQuery.css(
this[0], lower, false, "padding" ) :
4338             
null;
4339     };
4340
4341     
// outerHeight and outerWidth
4342     jQuery.fn[
"outer" + name] = function(margin) {
4343         
return this[0] ?
4344             jQuery.css(
this[0], lower, false, margin ? "margin" : "border" ) :
4345             
null;
4346     };
4347     
4348     
var type = name.toLowerCase();
4349
4350     jQuery.fn[ type ] = function( size ) {
4351         
// Get window width or height
4352         
return this[0] == window ?
4353             
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
4354             document.compatMode ==
"CSS1Compat" && document.documentElement[ "client" + name ] ||
4355             document.body[
"client" + name ] :
4356
4357             
// Get document width or height
4358             
this[0] == document ?
4359                 
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
4360                 Math.max(
4361                     document.documentElement[
"client" + name],
4362                     document.body[
"scroll" + name], document.documentElement["scroll" + name],
4363                     document.body[
"offset" + name], document.documentElement["offset" + name]
4364                 ) :
4365
4366                 
// Get or set width or height on the element
4367                 size === undefined ?
4368                     
// Get width or height on the element
4369                     (
this.length ? jQuery.css( this[0], type ) : null) :
4370
4371                     
// Set the width or height on the element (default to pixels if value is unitless)
4372                     
this.css( type, typeof size === "string" ? size : size + "px" );
4373     };
4374
4375 });
4376 })();



Full source code website bán hàng thương mại điện tử gần giống shopee 469.178 lượt xem

Gõ tìm kiếm nhanh...